Je découvre php, laravel, vuejs en même temps et je suppose qu'il y a des choses que je n'ai pas encore bien réussies;)
J'ai fait un nouveau composant "tableau" qui est une table basique et j'aimerais pour l'utiliser à de nombreux endroits dans mon application, où je spécifierais simplement son titre, ses colonnes et ses données. FootballerController est l'endroit où j'obtiens toutes mes données.
Voici ce qui fonctionne actuellement:
app.js
const tableau = new Vue({ components:{tableau:Tableau } }).$mount('#tableau');
<tableau v-bind:titre="{{ $title }}" :rows="{{ $gridData }}" :columns="{{ $gridColumns }}" > </tableau>
public function footballer($id){ //process to get all this data in DB ($footballer, $gridData, $gridColumns, $title) $footballer= (Footballer::select(SOME REQUEST)->where('id', '=', $id)->get())[0]; return view('footballers/footballer', ['footballer' => $footballer, 'gridData' => $gridData, 'gridColumns' => $gridColumns, 'title' => $title] ); }
Cela fonctionne.
Ensuite, voici ce que je voudrais: pouvoir mettre mes valeurs du contrôleur dans footballer.blade.php, qui utilise TableauComponent.vue p>
FootballerController
<template> <div > <h1 >{{titre}}</h1> <table > <thead> <tr> <th v-for="key in columns" {{ key | capitalize }} </th> </tr> </thead> <tbody> <tr v-for="entry in rows"> <td v-for="key in columns"> {{entry[key]}} </td> </tr> </tbody> </table> </div> </template> <script> export default { name:'tableau', props: { rows: Array, columns: Array, titre: String } } </script>
Et dans footballer.blade.php
<tableau v-bind:titre="title" :rows="gridData" :columns="gridColumns " :filter-key="searchQuery" > </tableau>
Ensuite, dans app.js , je n'aurais plus besoin de données
const tableau = new Vue({ components:{tableau:Tableau }, data: function() { return { title: "the best footballers", searchQuery: '', gridColumns: ['footballer', 'cote', 'nationalite'], gridData: [ { footballer: 'Remond', cote: 951, nationalite:'USA' }, { footballer: 'Marcel', cote: 935, nationalite:'ESP' }, { footballer: 'Stian', cote: 923, nationalite:'NOR' }, { footballer: 'Martin', cote: 923, nationalite:'USA' }, { footballer: 'Pierre', cote: 918, nationalite:'ESP' }, ] } } }).$mount('#tableau');
Mais cela ne fonctionne pas et me dit "La propriété ou la méthode n'est pas définie sur l'instance mais référencée lors du rendu"
Je ne gère pas du tout et je suis fatigué est-ce que j'ai la bonne façon de faire: ne dois-je pas récupérer mes données dans FootballerController? Sinon, où puis-je l'obtenir?
Merci beaucoup à l'avance.
3 Réponses :
Vous utilisez le symbole ':' avant vos attributs dans votre lame, ce qui signifie 'v-bind' comme le dit le document: VueJS Shorthands . Donc, d'abord, pour assigner une chaîne à un accessoire, vous n'avez pas besoin de ':' avant 'titre'.
Ensuite, pour résoudre votre problème, vous pouvez essayer d'ajouter une valeur par défaut à vos accessoires, par exemple: p>
props: { rows: { default: [] }, columns: { default: [] }, titre: { default: '' } }
Je n'ai pas essayé mais je pense que cela devrait fonctionner.
Merci beaucoup Takachi! en effet supprimer: aide quand j'ai une chaîne. Avec un tableau, cela ne fonctionne pas, même après avoir changé les accessoires comme vous l'avez suggéré: htmlspecialchars () s'attend à ce que le paramètre 1 soit une chaîne, tableau donné
Je pense que votre tableau de lignes et de colonnes contient un autre tableau ou un objet. Laravel fournit un bon outil de débogage qui est dd (). Cette méthode vous permet d'afficher le contenu du tableau sur votre page. L'utilisation de dd ($ rows)
dans votre contrôleur peut vous aider à comprendre votre contenu variable et à résoudre votre problème.
Lorsque vous utilisez {{value}}
à la fois dans le framework Blade et javascript en même temps. Vous devez utiliser @ {{value}}
pour éviter la collision entre Blade et Vue.
essayez
<tableau v-bind:titre="@{{ $title }}" :rows="@{{ $gridData }}" :columns="@{{ $gridColumns }}" > </tableau>
En plus de cela, lorsque vous utilisez : rows = "value"
, le value
doit être une syntaxe JavaScript, sinon lorsque rows = "value"
, la value
serait traitée comme string
. p>
Vous devrez peut-être utiliser json_encode
pour formater vos données depuis Laravel, ou utiliser @json
si vous utilisez Laravel 5.5 ^.
Merci beaucoup, en effet le tableau php en tableau javascript était le problème.
Dans le contrôleur php, j'analyse mes données en json
rows: { type: String, default: "" } var rowsArray = JSON.parse(this.rows)
Dans le php voir footballer.blade.php
<tableau titre="{{ $title }}" rows="{{ $gridData }}"> </tableau>
Et dans ma vue Vue, je recevais un tableau, et j'ai changé le code pour cela:
'gridData' =>json_encode($gridData),
Quelle version de Laravel utilisez-vous? 5.2?
Pouvez-vous afficher le contenu de
{{$ title}}
en maintenantCtrl + u
?