Je veux passer/stocker Laravel tableau dans la variable JavaScript. J'ai utilisé ->all()
donc j'obtiens le résultat comme ceci plutôt que objet:
array:83 [▼
0 => 1
1 => 11
2 => 12
...
]
Je peux y accéder en vue en utilisant {{ $theArray }}
.
Cependant, quoi que j'aie essayé, je n'ai pas pu le faire dans un tableau javascript.
J'ai essayé
var array = {{ $theArray }};
var array = {{{ $theArray }}};
J'ai l'impression d'être proche mais je n'ai pas pu le comprendre
var app = @json($array);
Fonctionne comme un charme
vous pouvez utiliser json_encode()
var array = {{ json_encode($theArray) }};
ou analyser la chaîne json en utilisant JSON.parse()
var array = JSON.parse('{{ json_encode($theArray) }}');
vous avez entouré de guillemets ou utilisez json_encode ()
var array = "{{ $theArray }}";
^ ^
ou, si la valeur dans une array()
var array = "{{ json_encode($theArray) }}";
^ ^
Sans avoir de guillemets autour de la variable javascript, cela vous générera une erreur. vous pouvez vérifier dans votre console.
Cela fonctionne pour moi :)
var array = {!! json_encode($theArray) !!};
celui-ci a fonctionné pour moi.
let array = JSON.parse('{!! json_encode($array) !!}');
Simplement, échappez aux caractères spéciaux en utilisant la syntaxe de la lame. Essaye ça.
var array = {!! $theArray !!};
De plus, vous n'avez pas besoin de l'analyser dans sa forme d'objet en JavaScript.
Parfois, vous pouvez passer un tableau à votre vue avec l'intention de le rendre en JSON afin d'initialiser une variable JavaScript. Par exemple:
<script>
var app = <?php echo json_encode($array); ?>;
</script>
Cependant, au lieu d'appeler manuellement json_encode
, Vous pouvez utiliser la directive Blade @json
. La directive @json
Accepte les mêmes arguments que la fonction json_encode
De PHP:
<script>
var app = @json($array);
var app = @json($array, JSON_PRETTY_PRINT);
</script>
La directive @json
Est également utile pour amorcer les composants Vue ou les attributs data- *:
<example-component :some-prop='@json($array)'></example-component>
https://laravel.com/docs/5.8/blade#blade-and-javascript-frameworks
Parfois, all()
ne suffit pas pour convertir votre collection Laravel en tableau. J'ai rencontré ce problème en essayant de transmettre la collection d'objets de type personnalisé à JS via Laravel view.
Pour obtenir le tableau sur le front end JS, vous devez appliquer la méthode Collection::values()
avant la méthode all()
.
Alors:
// In your HTTP controller
$collection = collect([myObj1,myObj2]); // The collection filled with custom type objects.
$myArray = $collection->values()->all(); // Then converted to an array. Just `all()` is not enough;
return view('myview', $myArray);
{{-- In your myview.blade.php --}}
<script>window.myArray= @json($myArray)</script>
Ensuite, dans votre JS window.myArray
, Vous obtenez un tableau []
, Pas un objet {}
.
Un peu de détails
Cela est probablement dû au fait que lorsque les index d'un tableau ne sont pas ascendants ordonnés PHP considère les index comme des clés d'objet, il considère alors le tableau comme un objet. Ainsi, la transformation en un au lieu d'un tableau. Laravel collection values()
réinitialise les clés du tableau. Je soupçonne qu'il s'applique PHP array_values()
sous le capot.