webentwicklung-frage-antwort-db.com.de

laravel-5 übergibt Variable an JavaScript

gibt es eine Möglichkeit, wie JavaScript die Variable vom kompakten Controller Laravel-5 erhalten kann?.

Beispiel: Ich habe den folgenden Code:

   $langs = Language::all();
   return View::make('NAATIMockTest.Admin.Language.index',compact('langs'));

Kann ich diesen langs bekommen und an JavaScript übergeben? Ich habe bereits PHP-Vars-To-Js-Transformer verwendet. Wenn ich jedoch JavaScript :: put für zwei Funktionen im Controller verwende. Es hat nicht funktioniert. Irgendeine Hilfe?

Dies ist mein Code mit PHP-Vars-To-Js-Transformer:

LanguageController: Dies ist meine Erstellungs- und Bearbeitungsfunktion:

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');

    }

das ist meine Ansicht erstellen:

 @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']) !!}&nbsp;
                              {!!   Html::linkAction('NAATIMockTest\[email protected]', 'Back', null, array('class' => 'btn btn-primary')) !!}
                        </div>
                    {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
    </div>
   @endsection

Dies ist meine Ansicht bearbeiten:

 @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: ') !!}&nbsp;{{ $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']) !!}&nbsp;
                            {!! Html::linkAction('NAATIMockTest\[email protected]', 'Back', null, array('class' => 'btn btn-primary')) !!}
                        </div>
                    {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
   </div>
   @endsection

meine javascript.php im config ordner: 

<?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',

];

Die Idee ist: Ich habe in MySQL eine Tabellensprache. Ich möchte die Dropdown-Liste mit mehreren Attributen anzeigen, und ich möchte auch mit anglejs suchen. Deshalb möchte ich die Variable vom Controller an JavaScript übergeben. Darüber hinaus habe ich in LanguageController die Funktion namens initLang, um zu überprüfen, ob eine Sprache in der Datenbank vorhanden ist. Sie wird nicht in der Dropdown-Liste in Ansicht erstellen angezeigt.

18
user1610851

Ein Arbeitsbeispiel für mich. 

Regler: 

public function tableView()
{
    $sites = Site::all();
    return view('main.table', compact('sites'));
}

Aussicht:

<script>    
    var sites = {!! json_encode($sites->toArray()) !!};
</script>

Um böswilliges/unbeabsichtigtes Verhalten zu verhindern, können Sie JSON_HEX_TAG verwenden, wie von Jon in dem Kommentar zu dieser SO Antwort vorgeschlagen

<script>    
    var sites = {!! json_encode($sites->toArray(), JSON_HEX_TAG) !!};
</script>
52
ken

Standard PHP Objekte

Der beste Weg, PHP - Variablen für JavaScript bereitzustellen, ist json_encode. Wenn Sie Blade verwenden, können Sie Folgendes tun:

<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>

Es gibt auch eine Blade-Direktive zum Dekodieren in JSON. Ich bin mir nicht sicher, welche Version von Laravel es gibt, aber in 5.5 ist es verfügbar. Verwenden Sie es wie folgt:

<script>
    var array = @json($array);
</script>

Jsonable's

Bei der Verwendung von Laravel-Objekten, z. Collection oder Model sollten Sie die ->toJson()-Methode verwenden. Alle Klassen, die die \Illuminate\Contracts\Support\Jsonable-Schnittstelle implementieren, unterstützen diesen Methodenaufruf. Der Anruf wird automatisch JSON zurückgegeben.

<script>
    var collection = {!! $collection->toJson() !!};
    var model = {!! $model->toJson() !!};
</script>

Wenn Sie die Model-Klasse verwenden, können Sie die $hidden-Eigenschaft innerhalb von class definieren. Diese werden in JSON gefiltert. Die $hidden-Eigenschaft verbirgt, wie der Name schon sagt, sensiblen Inhalt. Also ist dieser Mechanismus der beste für mich. Mach es wie folgt:

class User extends Model
{
    /* ... */

    protected $hidden = [
        'password', 'ip_address' /* , ... */
    ];

    /* ... */
}

Und irgendwo in deiner Sicht

<script>
    var user = {!! $user->toJson() !!};
</script>
12
algorhythm
$langs = Language::all()->toArray();
return View::make('NAATIMockTest.Admin.Language.index', [
    'langs' => $langs
]);

dann in sicht

<script type="text/javascript">
    var langs = {{json_encode($langs)}};
    console.log(langs);
</script>

Es ist nicht so schön

3
Pawel Bieszczad

Versuchen Sie Folgendes: - https://github.com/laracasts/PHP-Vars-To-Js-Transformer Ist eine einfache Möglichkeit, PHP - Variablen an Javascript anzuhängen.

2
PawelW

Ist sehr einfach, ich verwende diesen Code:

Controller :

$langs = Language::all()->toArray();
return view('NAATIMockTest.Admin.Language.index', compact('langs'));

Aussicht :

<script type="text/javascript">
    var langs = <?php echo json_decode($langs); ?>;
    console.log(langs);
</script>

hoffe es war hilfreich, grüße!

Ich weiß, dass die nächsten Zeilen nicht optimiert sind, aber es ist eine schnelle und lesbare Möglichkeit, um es zum Laufen zu bringen:

<script>
    var sampleTags = [];
    @foreach ($services as $service)
        sampleTags.Push('{{ $service->name }}');
    @endforeach
</script>

Edit: Wenn die Zeichenfolge Sonderzeichen enthält (wie ó), muss {!! $service->name !!} verwendet werden.

0
JCarlos