2013-07-22 19 views
10

Recentemente ho preso Angular come esercizio di apprendimento.Angolare: fornitura di metodi per il modello ng

Mi piacerebbe passare un metodo a ng-model o un'espressione che potrebbe valutare a uno.

In questo violino http://jsfiddle.net/C4aGk/ vedrai che ho codificato il campo come ng-model="record.inner[0].text" e funziona, ora la cosa è, vorrei sostituire lo zero codificato con qualcosa che viene restituito a run- orario, selezionato secondo un criterio, indicare id = 1.

Il mio codice HTML:

<div ng-controller="MainController" ng-app> 
    <div ng-repeat="record in records"> 
     <input ng-model="record.inner[0].text"> <span>{{record.outer}}</span> 
     <div ng-repeat="nested in record.inner">{{nested.id}} - {{nested.text}}</div> 
     <hr /> 
    </div> 
</div> 
<br/> 

e le corrispondenti js:

function MainController($scope) { 
    $scope.records = [{ 
     outer: "Hello", 
     inner: [{ 
      id: 1, 
      text: "Angular" 
     }, { 
      id: 2, 
      text: "jQuery" 
     }] 
    }, { 
     outer: "World", 
     inner: [{ 
      id: 1, 
      text: "Node.js" 
     }, { 
      id: 2, 
      text: "Underscore.js" 
     }] 
    }]; 

    $scope.getText = function (record) { 
     var index = 0; 
     for (nested in record.inner) { 
      if (nested.id === 1) { 
       return "record.inner[" + index + "].text"; 
      } 
      index++; 
     } 
    }; 

Ho provato mettendo ng-model="getText(record)" secondo https://groups.google.com/forum/#!topic/angular/Pef6LY2rT7g senza successo, e un'altra richiesta alzato questo https://github.com/angular/angular.js/pull/1328 che è altrettanto inutile a me.

Qualsiasi aiuto sarà molto apprezzato.

+2

Hai un bug nella funzione 'getText'. 'per/in' i loop non funzionano così in JavaScript. Dovresti cambiare l'istruzione if in 'if (record.inner [nested] .id === 1) {'. Ad ogni modo, ciò non risolverà il tuo intero problema. Potrebbe essere meglio descrivere ciò che stai cercando di fare e non come stai cercando di farlo. Ad esempio, se stai solo provando a consentire all'utente di modificare [0] o [1] dopo aver fatto clic su un pulsante Modifica, sarebbe meglio/più facile, in Angolare, avere campi separati da mostrare/nascondere. – Langdon

+0

Grazie a @Langdon per aver colto l'errore, di solito evito i cicli "for/in" quindi sono un po 'arrugginito. Sto seguendo la guida di Dan Wahlin per Angular JS e stavo cercando di rifare l'app del cliente referenziata nella presentazione quando mi è venuto in mente di provare questo e poiché avrebbe dovuto funzionare secondo i link che ho citato. Ho pensato che dovesse essere qualcosa che sto sbagliando. Sto solo esplorando le direttive al momento, ecco da dove viene la domanda. :) – adeelx

risposta

11

Tutto ciò che si passa a ng-model viene valutato come un'espressione angolare rispetto all'ambito. Ciò significa che record.inner[0].text viene valutato come $scope.record.inner[0].text e quindi viene utilizzato il risultato dell'espressione. Quando si utilizza getText(record), la valutazione angolare è $scope.getText(record) e il modello ng ottiene l'accesso al risultato di questa valutazione. Tenere presente che ng-model non valuta il risultato di questa chiamata di funzione.

Il tuo problema è che stai restituendo il risultato come una stringa di espressione angolare, ma non lo valuti mai, quindi a ng-model viene data una stringa che non può usare. Ci sono molti modi per ridisegnare il tuo codice per far fronte a questo, ma il modo più semplice (e probabilmente non il migliore) sarebbe quello di usare qualcosa come ng-init per ottenere il risultato della chiamata di funzione e quindi inserire quel risultato nella ng- modello. Vedi questo violino per un esempio rapido http://jsfiddle.net/z5z9s/

+2

Non penso 'ng-model =" {{scopeFunctionThatReturnsAString()}} "dovrebbe funzionare. Ne hai un esempio? – Langdon

+0

@Langdon Hai ragione. Grazie per averlo capito! Risolverò la mia risposta. – Jon7

+0

Grazie per la soluzione, potrei andare con questo se non c'è niente di meglio disponibile. Se non ti dispiace spiegare, la documentazione Angular dice 'ngModel - {string} - Espressione angolare assegnabile a data-bind to., Cosa implica questo se non ciò che ho fatto? Non sono stato in grado di far funzionare nessuna funzione nella direttiva 'ng-model'. – adeelx

Problemi correlati