javaScriptがコンパクトコントローラーLaravel-5から変数を取得する方法はありますか。
例:以下のコードがあります:
$langs = Language::all();
return View::make('NAATIMockTest.Admin.Language.index',compact('langs'));
この言語を取得してJavaScriptに渡すことはできますか?既にPHP-Vars-To-Js-Transformerを使用しました。しかし、コントローラーの2つの関数にJavaScript :: putを使用する場合。うまくいきませんでした。助けがありますか?
これは、PHP-Vars-To-Js-Transformerを使用した私のコードです。
LanguageController:これは私の作成および編集機能です:
public function create()
{
$names = $this->initLang();
Javascript::put([
'langs' => $names
]);
return View::make('NAATIMockTest.Admin.Language.create',compact('names'));
}
public function edit($id)
{
//
$lang = Language::findOrFail($id);
$names = $this->initLang();
Javascript::put([
'langs' => $names
]);
return View::make('NAATIMockTest.Admin.Language.edit', compact('lang'));
// return View::make('NAATIMockTest.Admin.Language.edit');
}
これは私のビュー作成です:
@extends('AdLayout')
@section('content')
< script type="text/javascript">
var app = angular.module('myApp', []);
app.controller('langCtrl', function($scope) {
$scope.languages = langs;
});
</script>
<div class="container-fluid" ng-app="myApp" ng-controller="langCtrl">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">
<h2>Create language
</h2>
</div>
<div class="panel-body">
{!! Form::open() !!}
<p class="text-center">
{!! Form::label('Name','Language: ') !!}
<input type="text" name="searchLanguage" ng-model="searchLanguage">
</p>
<select name="Name[]" multiple size="10" ng-model="lang" ng-click="show()">
<option value="@{{v}}" ng-repeat="(k,v) in languages | filter:searchLanguage">
@{{v}}
</option>
</select><br>
<div class="text-center">
{!! Form::submit('Create',['class'=>'btn btn-primary']) !!}
{!! Html::linkAction('NAATIMockTest\LanguageController@index', 'Back', null, array('class' => 'btn btn-primary')) !!}
</div>
{!! Form::close() !!}
</div>
</div>
</div>
</div>
</div>
@endsection
これは私のビュー編集です:
@extends('AdLayout')
@section('content')
<script type="text/javascript">
var app = angular.module('myApp', []);
app.controller('langCtrl', function($scope) {
$scope.languages = langs;
});
</script>
<div class="container-fluid" ng-app="myApp" ng-controller="langCtrl">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading"><h2>Edit #{{ $lang->id}}</h2></div>
<div class="panel-body">
{!! Form::model($lang) !!}
{!! Form::label('Name','Language: ') !!} {{ $lang->Name }}
<!-- {!! Form::text('Name',null,['disabled']) !!}<br> -->
{!! Form::hidden('id') !!}<input type="text" name="searchLanguage" ng-model="searchLanguage">
</p>
<select name="Name[]" size="10">
<option value="@{{v}}" ng-repeat="(k,v) in languages | filter:searchLanguage">
@{{v}}
</option>
</select><br>
<div class="text-center">
{!! Form::submit('Update',['class'=>'btn btn-info']) !!}
{!! Html::linkAction('NAATIMockTest\LanguageController@index', 'Back', null, array('class' => 'btn btn-primary')) !!}
</div>
{!! Form::close() !!}
</div>
</div>
</div>
</div>
</div>
@endsection
configフォルダー内のjavascript.php:
<?php
return [
/*
|--------------------------------------------------------------------------
| View to Bind JavaScript Vars To
|--------------------------------------------------------------------------
|
| Set this value to the name of the view (or partial) that
| you want to prepend all JavaScript variables to.
|
*/
'bind_js_vars_to_this_view' => 'footer',
'bind_js_vars_to_this_view' => 'NAATIMockTest.Admin.Language.create',
'bind_js_vars_to_this_view' => 'NAATIMockTest.Admin.Language.edit',
/*
|--------------------------------------------------------------------------
| JavaScript Namespace
|--------------------------------------------------------------------------
|
| By default, we'll add variables to the global window object. However,
| it's recommended that you change this to some namespace - anything.
| That way, you can access vars, like "SomeNamespace.someVariable."
|
*/
'js_namespace' => 'window',
];
アイデアは次のとおりです。mysqlにテーブル言語があります。選択する複数の属性を含むドロップダウンリストを表示し、angularjsでも検索したいです。そのため、変数をコントローラーからJavaScriptに渡したいのです。さらに、言語がデータベース内に存在するかどうかを確認するinitLangと呼ばれるLanguageController内の関数があり、ビューの作成時にドロップダウンリスト内に表示されません。
私のための1つの実例。
コントローラ:
public function tableView()
{
$sites = Site::all();
return view('main.table', compact('sites'));
}
見る:
<script>
var sites = {!! json_encode($sites->toArray()) !!};
</script>
悪意のある/意図しない動作を防ぐために、これにリンクするコメントでJonが示唆するJSON_HEX_TAG
を使用できます SO answer
<script>
var sites = {!! json_encode($sites->toArray(), JSON_HEX_TAG) !!};
</script>
標準のPHPオブジェクト
PHP変数をJavaScriptに提供する最良の方法はjson_encode
です。 Bladeを使用する場合、次のように実行できます。
<script>
var bool = {!! json_encode($bool) !!};
var int = {!! json_encode($int) !!};
/* ... */
var array = {!! json_encode($array_without_keys) !!};
var object = {!! json_encode($array_with_keys) !!};
var object = {!! json_encode($stdClass) !!};
</script>
JSON
にデコードするためのBladeディレクティブもあります。 Laravelのどのバージョン以降かはわかりませんが、5.5では使用可能です。次のように使用します。
<script>
var array = @json($array);
</script>
Jsonable's
Laravelオブジェクトを使用する場合(例: Collection
またはModel
->toJson()
メソッドを使用する必要があります。 \Illuminate\Contracts\Support\Jsonable
インターフェイスを実装するすべてのクラスは、このメソッド呼び出しをサポートしています。呼び出しは自動的にJSON
を返します。
<script>
var collection = {!! $collection->toJson() !!};
var model = {!! $model->toJson() !!};
</script>
Model
クラスを使用する場合、class
内で$hidden
プロパティを定義でき、それらはJSON
でフィルターされます。 $hidden
プロパティは、その名前の説明として、機密コンテンツを隠します。したがって、このメカニズムは私にとって最適です。次のようにしてください:
class User extends Model
{
/* ... */
protected $hidden = [
'password', 'ip_address' /* , ... */
];
/* ... */
}
そしてあなたの意見のどこか
<script>
var user = {!! $user->toJson() !!};
</script>
$langs = Language::all()->toArray();
return View::make('NAATIMockTest.Admin.Language.index', [
'langs' => $langs
]);
その後、ビューで
<script type="text/javascript">
var langs = {{json_encode($langs)}};
console.log(langs);
</script>
それはかなりカントーではありません
これを試してください- https://github.com/laracasts/PHP-Vars-To-Js-Transformer PHP変数をJavascriptに追加する簡単な方法です。
私は次の行が最適化されていないことを知っていますが、それはそれを機能させるための高速で読みやすい方法です:
<script>
var sampleTags = [];
@foreach ($services as $service)
sampleTags.Push('{{ $service->name }}');
@endforeach
</script>
編集:申し訳ありませんが、文字列に特殊文字(ó
など)が含まれる場合、{!! $service->name !!}
を使用する必要があります。
非常に簡単です、私はこのコードを使用します:
コントローラー:
$langs = Language::all()->toArray();
return view('NAATIMockTest.Admin.Language.index', compact('langs'));
表示:
<script type="text/javascript">
var langs = <?php echo json_decode($langs); ?>;
console.log(langs);
</script>
よろしくお願いします!