2015-05-06 25 views
8

c'è qualche modo in cui JavaScript può ottenere la variabile dal controller compatto Laravel-5.laravel-5 passa variabile a JavaScript

Esempio: Ho il codice qui sotto:

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

posso trovare questo Langs e passarlo a JavaScript? Ho già utilizzato PHP-Vars-To-Js-Transformer. Ma quando uso JavaScript :: put per due funzioni nel controller. Non ha funzionato. Qualsiasi aiuto?

Questo è il mio codice utilizzando PHP-Vars-To-Js-Transformer:

LanguageController: Questo è il mio creare e modificare la funzione:

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

    } 

questa è la mia opinione a creare:

@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 

Questa è la mia opinione 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>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 

mia javascript.php nella cartella config:

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

]; 

L'idea è: Ho una lingua tabella in mysql. Voglio mostrare l'elenco a discesa con più attributi da scegliere e voglio anche cercare con angularjs. Ecco perché voglio passare la variabile dal controller a JavaScript. Inoltre, ho la funzione all'interno di LanguageController chiamata initLang per verificare se esiste una lingua all'interno del database, non è visualizzata all'interno dell'elenco a discesa in create view.

+0

puoi anche mostrare come desideri utilizzare lang nel tuo codice javacript? – Digitlimit

+0

Dato che stai già utilizzando un pacchetto, ti preghiamo di mostrarci il codice che non funziona. (modifica la tua domanda) – lukasgeiter

+0

Forse le due funzioni hanno reso la vista o parziale, hai scelto di associare le variabili javascript a? –

risposta

2
$langs = Language::all()->toArray(); 
return View::make('NAATIMockTest.Admin.Language.index', [ 
    'langs' => $langs 
]); 

poi in vista

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

La sua non è abbastanza tho

+0

grazie per il tuo codice ma mi mostra questo problema: FatalErrorException in LanguageController.php linea 34: Chiama a una funzione membro toArray() su un non oggetto – user1610851

+0

puoi pubblicare il codice su quella linea e qualcosa di rilevante ad esso? –

+0

questo errore è variabile non definita: langs (Visualizza: /home/thienvulai/laravel/sls/resources/views/NAATIMockTest/Admin/Language/create.blade.php). Quando ho cercato di usare Javascript :: mettere ([ \t \t \t 'Langs' => $ nomi \t \t \t]); – user1610851

24

Un esempio di lavoro per me.

Controller:

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

Vista:

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

Ha funzionato come Magic, anche se è molto semplice e semplice ma dimenticabile, Thx –

+0

è uno dei motivi per cui ho messo la risposta anche qui, per il futuro mi riferirò forse ancora! – ken

+0

Si potrebbe voler aggiungere JSON_HEX_TAG a json_encode '{!! json_encode ($ sites-> toArray(), JSON_HEX_TAG) !!}; 'http://stackoverflow.com/questions/24855186/most-efficient-way-to-pass-php-variables-to-external-javascript-or -jquery-file – Jon

0

So che le prossime righe non sono ottimizzati, ma è un modo veloce e leggibile per farlo funzionare:

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

Modifica: Siamo spiacenti, se la stringa ha caratteri speciali (come ó), è necessario utilizzare {!! $service->name !!}.

3

standard PHP oggetti

Il modo migliore per fornire variabili PHP a JavaScript ist json_encode.Quando si utilizza lama si può fare come segue:

<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) !!}; 
</script> 

C'è anche una direttiva della lama per la decodifica di JSON. Non sono sicuro da che versione di Laravel, ma in 5.5 è disponibile. Usalo come segue:

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

Jsonable di

Quando si utilizza laravel oggetti per esempio Collection o Model si dovrebbe usare il metodo ->toJson(). Tutte le classi che implementano l'interfaccia \Illuminate\Contracts\Support\Jsonable supportano questa chiamata di metodo. La chiamata ritorna automaticamente JSON.

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

Quando si utilizza Model classe che si può definire la proprietà $hidden all'interno del class e quelli saranno filtrati in JSON. La proprietà $hidden come il nome descritto nasconde il contenuto sensibile. Quindi questo meccanismo è il migliore per me. Non è come segue:

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

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

    /* ... */ 
} 
+0

'var bool = {!! json_encode ($ bool) !!}; 'questo lavoro per me. Grazie uomo! –

Problemi correlati