2013-07-22 13 views
10

Niedawno podjęłam Angular jako ćwiczenie edukacyjne.Kąt: dostarczanie metod do modelu ng

Chciałbym przekazać metodę do ng-model lub wyrażenie, które może go ocenić.

W tym skrzypcach http://jsfiddle.net/C4aGk/ zobaczysz, że ciężko zakodowałem to pole jako ng-model="record.inner[0].text" i działa, teraz chodzi o to, chciałbym zastąpić zakodowane zero czymś, co jest zwracane w czas wybrany według kryterium: id = 1.

Mój kod 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/> 

i odpowiadające im 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++; 
     } 
    }; 

Próbowałem umieszczenie ng-model="getText(record)" zgodnie https://groups.google.com/forum/#!topic/angular/Pef6LY2rT7g bez powodzenia, a inna wyszukiwarka pojawił się ten, który jest równie https://github.com/angular/angular.js/pull/1328 nieprzydatny dla mnie.

Każda pomoc będzie bardzo ceniona.

+2

Masz błąd w funkcji 'getText'. Pętle 'for/in' nie działają w JavaScript. Musisz zmienić instrukcję if na 'if (record.inner [nested] .id === 1) {'. Tak czy inaczej, to nie rozwiąże całego twojego problemu. Lepiej może opisać, co próbujesz zrobić, a nie jak próbujesz to zrobić. Na przykład, jeśli po prostu chcesz zezwolić użytkownikowi na edycję [0] lub [1] po kliknięciu przycisku Edytuj, w Angularu byłoby lepiej/łatwiej mieć oddzielne pola, które pokazujesz/ukrywasz. – Langdon

+0

Dziękuję @Langdon za złapanie błędu, zwykle unikam pętli 'for/in', więc jestem trochę zardzewiały. Postępuję zgodnie z przewodnikiem Dan Wahlin dla Angular JS i próbowałem przerobić aplikację klienta wymienioną w prezentacji, kiedy przyszło mi do głowy, aby spróbować i dlatego, że powinna działać zgodnie z linkami, które cytowałem. Myślałem, że to musi być coś, co robię źle. Po prostu analizuję dyrektywy w tej chwili, stąd pochodzi to pytanie. :) – adeelx

Odpowiedz

11

Wszystko, co przekazujesz do modelu ng jest oceniane jako wyrażenie kątowe w stosunku do zakresu. Oznacza to, że record.inner[0].text jest oceniane jako $scope.record.inner[0].text, a następnie używany jest wynik tego wyrażenia. Gdy używasz getText(record), kątowa ocenia $scope.getText(record), a model ng uzyskuje dostęp do wyniku tej oceny. Należy pamiętać, że ng-model nie ocenia wyniku tej funkcji.

Twój problem polega na tym, że zwracasz wynik jako ciąg kątowy wyrażenia, ale nigdy go nie ocenisz, więc ng-model otrzymuje łańcuch, którego nie może użyć. Istnieje wiele sposobów na przeprojektowanie kodu, aby poradzić sobie z tym, ale prosty (i prawdopodobnie nie najlepszy) sposób byłoby użycie czegoś takiego jak ng-init, aby uzyskać wynik wywołania funkcji, a następnie wstawić ten wynik do ng- Model. Zobacz ten skrzypce na szybki przykład: http://jsfiddle.net/z5z9s/

+2

Nie sądzę, że 'ng-model =" {{scopeFunctionThatReturnsAString()}} "' powinien działać. Czy masz na to przykład? – Langdon

+0

@Langdon Masz rację. Dzięki za złapanie tego! Naprawię moją odpowiedź. – Jon7

+0

Dziękuję za rozwiązanie, może po prostu pójdę z tym, jeśli nic lepszego nie będzie dostępne. Jeśli nie masz nic przeciwko tłumaczeniu, dokumentacja Angular mówi "ngModel - {string} - Przypisywalne wyrażenie kątowe do powiązania danych z.", Co to oznacza, jeśli nie to, co zrobiłem? Nie udało mi się w ogóle uzyskać żadnych funkcji w dyrektywie "ng-model". – adeelx

Powiązane problemy