2013-07-22 5 views
10

Ich habe Angular vor kurzem als eine Lernübung aufgenommen.Angular: Providing Methoden zu ng-Modell

Ich würde gerne eine Methode an ng-model oder einen Ausdruck übergeben, der zu einem auswerten könnte. In dieser Geige http://jsfiddle.net/C4aGk/ werden Sie sehen, dass ich das Feld als ng-model="record.inner[0].text" hart codiert habe und es funktioniert, jetzt ist die Sache, ich möchte die hart-codierte Null mit etwas ersetzen, das bei run zurückgegeben wird Zeit, ausgewählt durch ein Kriterium sagen id = 1.

Mein HTML-Code:

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

und die entsprechende 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++; 
     } 
    }; 

Ich habe versucht, ohne Erfolg ng-model="getText(record)" wie pro https://groups.google.com/forum/#!topic/angular/Pef6LY2rT7g platzieren, und eine andere Suche diesen https://github.com/angular/angular.js/pull/1328 aufgedreht, die gleich ist nicht hilfreich für mich.

Jede Hilfe wird sehr geschätzt.

+2

Sie haben einen Fehler in Ihrer 'getText' Funktion. 'for/in'-Loops funktionieren in JavaScript nicht so. Sie müssten die if-Anweisung in 'if (record.inner [nested] .id === 1) {' ändern. So oder so, das wird Ihr Problem nicht beheben. Es könnte besser sein, zu beschreiben, was Sie versuchen und nicht wie Sie es versuchen. Wenn Sie zum Beispiel nur versuchen, den Benutzer nach dem Klicken auf eine Schaltfläche Bearbeiten [0] oder [1] bearbeiten zu lassen, wäre es besser/einfacher, in Angular separate Felder zu haben, die Sie ein-/ausblenden. – Langdon

+0

Danke @Langdon für den Fehler, ich vermeide normalerweise die 'for/in'-Schleifen, also bin ich ein bisschen eingerostet. Ich folge Dan Wahlins Anleitung zu Angular JS und versuchte, die Kunden-App, auf die in der Präsentation Bezug genommen wurde, neu zu gestalten, als mir der Gedanke kam, dies zu versuchen, und da es gemäß den angegebenen Links funktionieren sollte. Ich dachte, es wäre etwas, was ich falsch mache. Ich erforsche gerade die Richtlinien im Moment, da kam die Frage. :) – adeelx

Antwort

11

Alles, was Sie an das ng-Modell übergeben, wird als Winkelausdruck für den Bereich ausgewertet. Das bedeutet, dass record.inner[0].text als $scope.record.inner[0].text ausgewertet wird und dann das Ergebnis dieses Ausdrucks verwendet wird. Wenn Sie getText(record) verwenden, wertet angle $scope.getText(record) aus, und ng-model erhält Zugriff auf das Ergebnis dieser Auswertung. Beachten Sie, dass ng-model das Ergebnis dieses Funktionsaufrufs nicht auswertet.

Ihr Problem ist, dass Sie das Ergebnis als Winkelausdruck-String zurückgeben, aber nie evaluieren, so dass ng-model eine Zeichenfolge erhält, die es nicht verwenden kann. Es gibt viele Möglichkeiten, Ihren Code umzugestalten, um damit umzugehen, aber der einfache (und wahrscheinlich nicht beste) Weg wäre, etwas wie ng-init zu verwenden, um das Ergebnis des Funktionsaufrufs zu erhalten und dann dieses Ergebnis in die ng- Modell. Sehen Sie diese Geige für ein schnelles Beispiel http://jsfiddle.net/z5z9s/

+2

Ich glaube nicht, dass 'ng-model = "{{scopeFunctionThatReturnsAString()}}" 'funktionieren soll. Hast du ein Beispiel dafür? – Langdon

+0

@Langdon Sie haben Recht. Danke, dass du das erwischt hast! Ich werde meine Antwort reparieren. – Jon7

+0

Danke für die Lösung, ich könnte einfach mitgehen, wenn nichts Besseres verfügbar ist. Wenn es Ihnen nichts ausmacht zu erklären, sagt die Angular-Dokumentation 'ngModel - {string} - Zuweisbarer Winkelausdruck zur Datenbindung an '. Was bedeutet das, wenn nicht was ich getan habe? Ich habe keinerlei Funktionen in der 'ng-Modell'-Richtlinie bekommen. – adeelx

Verwandte Themen