私のコードでは typeahead.js を使用しています。 Laravel 5を使用しており、var states
私の{{ $jobs }}
変数。すべての役職を配列としてリストする必要があります。
私のコントローラーには
$jobs = Job::all(['job_title']);
JavaScriptでループメソッドを知っていますが、JavaScriptでブレードの変数を「リンク」する方法がわかりません。誰でも方法を知っていますか?
私が試した、my.js
var jobs = {{ $jobs }}
しかし、それはうまくいきません。
配列のようなより複雑な変数型の場合、最善の策は、それをJSONに変換し、それをテンプレートにエコーし、JavaScriptでデコードすることです。このような:
var jobs = JSON.parse("{{ json_encode($jobs) }}");
PHPは、このコードを実行するために実行する必要があります。この場合は、ブレードテンプレート内に配置する必要があります。JavaScriptコードが1つ以上の個別のファイルにある場合(これは良いことです!)変数を渡すテンプレートにインラインスクリプトタグを追加するだけです(それが実行されることを確認してくださいbefore JavaScriptコードの残りの部分です。通常はdocument.ready
がその答えです)
<script>
var jobs = JSON.parse("{{ json_encode($jobs) }}");
</script>
このようにするのが気に入らない場合は、別のajaxリクエストでデータをフェッチすることをお勧めします。
これは私のために働く
jobs = {!! json_encode($jobs) !!};
上記に追加するだけです:
var jobs = JSON.parse("{{ json_encode($jobs) }}");
エスケープされたhtmlエンティティを返すため、JavaScriptでjsonオブジェクトをループできなくなります。これを解決するには、以下を使用してください:
var jobs = JSON.parse("{!! json_encode($jobs) !!}");
または
var jobs = JSON.parse(<?php echo json_encode($jobs); ?>);
laravel 6これは私にとってはうまくいきます
laravel bladeディレクティブを使用する
var jobs = {!! json_encode($jobs) !!};
@json
ディレクティブも使用
var jobs = @json($jobs);
pHPスタイルを使用
var jobs = <?php echo json_encode($jobs); ?>
このアプローチは私にとってうまくいきます:
var job = {!! json_encode($jobs ) !!}
Javaスクリプトで使用
これを解決するには、レイアウトファイルの<head>
のwindow
オブジェクトに参照を配置し、任意のコンポーネントに注入できるミックスインでその参照を選択します。
TLDRソリューション
。env
GEODATA_URL="https://geo.some-domain.com"
config/geodata.php
<?php
return [
'url' => env('GEODATA_URL')
];
resources/views/layouts/root.blade.php
<head>
<script>
window.geodataUrl = "{{ config('geodata.url') }}";
</script>
</head>
resources/js/components/mixins/geodataUrl.js
const geodataUrl = {
data() {
return {
geodataUrl: window.geodataUrl,
};
},
};
export default geodataUrl;
使用量
<template>
<div>
<a :href="geodataUrl">YOLO</a>
</div>
</template>
<script>
import geodataUrl from '../mixins/geodataUrl';
export default {
name: 'v-foo',
mixins: [geodataUrl],
data() {
return {};
},
computed: {},
methods: {},
};
</script>
TLDRソリューションの終了
必要に応じて、これをapp.js
エントリポイントに追加することにより、代わりにグローバルミックスインを使用できます。
Vue.mixin({
data() {
return {
geodataUrl: window.geodataUrl,
};
},
});
ただし、このパターンはwindow
オブジェクト上にあるため、機密データには使用しないことをお勧めします。
このソリューションは、追加のライブラリを使用せず、コードのチェーンが非常に明確であるため、気に入っています。コードを"window.geodataUrl"
で検索し、コードが機能する方法と理由を理解するために必要なすべてを確認できるという点で、grepテストに合格しています。
コードが長期間存続し、別の開発者がそれに遭遇する可能性がある場合、その考慮事項は重要です。
しかし、JavaScript::put([])
は私が思うに、持つ価値のあるまともなユーティリティですが、過去に問題が発生した場合にデバッグするのが非常に難しいことが嫌いでした。データのコードベース。
いくつかのVueを消費するコードがJavaScript::put([ 'chartData' => $user->chartStuff ])
からのwindow.chartData
を使用していると想像してください。コードベースでのchartData
への参照の数によっては、特にPHPファイルがwindow.chartData
を機能させる責任があったファイルを発見するのに非常に長い時間がかかります。特に、そのコードを記述せず、次の人が知らない場合はJavaScript::put()
使用されています。
その場合、次のようにコードにコメントを入れることをお勧めします。
/* data comes from poop.php via JavaScript::put */
次に、その人はコードを"JavaScript::put"
で検索し、すばやく見つけることができます。実装の詳細を忘れてから6か月後には、「人」が自分になる可能性があることに注意してください。
Vueコンポーネントのプロップ宣言を次のように使用することは常に良い考えです:
props: {
chartData: {
type: Array,
required: true,
},
},
私の要点は、JavaScript::put()
を使用する場合、Vueは、コンポーネントがデータを受信できない場合、簡単に検出できません。Vue mustデータが参照する瞬間にデータがウィンドウオブジェクトにあると想定します。代わりに、GETエンドポイントを作成して、作成/マウントされたライフサイクルメソッドでフェッチ呼び出しを行うのが最善の方法です。
データの取得/設定に関しては、LaravelとVue)の間で明示的な契約を結ぶことが重要だと思います。
オプションを提供することでできる限り支援するために、ES6構文シュガーを使用してフェッチ呼び出しを行う例を次に示します。
routes/web.php
Route::get('/charts/{user}/coolchart', 'UserController@getChart')->name('user.chart');
app/Http/Controllers/UserController.php
public function getChart(Request $request, User $user)
{
// do stuff
$data = $user->chart;
return response()->json([
'chartData' => $data,
]);
}
Vueのどこでも、特に作成されたライフサイクルメソッド:
created() {
this.handleGetChart();
},
methods: {
async handleGetChart() {
try {
this.state = LOADING;
const { data } = await axios.get(`/charts/${this.user.id}/coolchart`);
if (typeof data !== 'object') {
throw new Error(`Unexpected server response. Expected object, got: ${data}`);
}
this.chartData = data.chartData;
this.state = DATA_LOADED;
} catch (err) {
this.state = DATA_FAILED;
throw new Error(`Problem getting chart data: ${err}`);
}
},
},
この例では、VueコンポーネントがMealy有限状態マシンであることを前提としています。これにより、コンポーネントは常に1つの状態にしかなりませんが、状態を自由に切り替えることができます。
計算された小道具としてこのような状態を使用することをお勧めします。
computed: {
isLoading() { return (this.state === LOADING); },
isDataLoaded() { return (this.state === DATA_LOADED); },
isDataFailed() { return (this.state === DATA_FAILED); },
},
次のようなマークアップで:
<div v-show="isLoading">Loading...</div>
<v-baller-chart v-if="isDataLoaded" :data="chartData"></v-baller-chart>
<button v-show="isDataFailed" type="button" @click="handleGetChart">TRY AGAIN</button>