2013-07-22 8 views
10

最近、学習の練習としてAngularを取り上げました。Angular:ng-modelへのメソッドの提供

メソッドをng-modelまたは1と評価される式に渡したいと思います。

http://jsfiddle.net/C4aGk/で私はフィールドをng-model="record.inner[0].text"としてハードコーディングしていることがわかりますが、今のところ、ハードコーディングされたゼロを実行時に返されるものに置き換えたいと思います。基準によって選択された時間、id = 1とする。

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

と対応する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++; 
     } 
    }; 

ノー成功を収めてhttps://groups.google.com/forum/#!topic/angular/Pef6LY2rT7gごとにng-model="getText(record)"を配置しようとした、と別の検索が均等にあるこのhttps://github.com/angular/angular.js/pull/1328を上げ私には役に立たない。

ご協力いただければ幸いです。

+2

'getText'関数にバグがあります。 'for/in'ループはJavaScriptのようには動作しません。 if文を 'if(record.inner [nested] .id === 1){'に変更する必要があります。いずれにせよ、それはあなたの問題全体を解決するものではありません。あなたが何をしようとしているのではなく、何をしようとしているのかを記述する方が良いかもしれません。たとえば、ユーザーが[編集]ボタンをクリックした後で[0]または[1]を編集できるようにする場合は、表示/非表示の別々のフィールドを使用する方がよいでしょう。 – Langdon

+0

私は間違いをキャッチするために@ Langdonありがとう、私は通常for/inループを避けるので、私は少し錆びています。私はDan WahlinのAngular JSガイドをフォローしています。プレゼンテーションで参照されているカスタマーアプリケーションをリメイクしようとしていましたが、これは試してみると、私が引用したリンクごとに機能するはずでした。私はそれが私が間違っている何かでなければならないと思った。私はちょうどその時点で指示を探っています、それは質問がどこから来たかです。 :) – adeelx

答えて

11

ng-modelに渡すものはすべて、スコープに対して角度表現として評価されます。つまり、record.inner[0].text$scope.record.inner[0].textと評価され、その式の結果が使用されます。 getText(record)を使用すると、angleは$scope.getText(record)と評価され、ng-modelはこの評価の結果にアクセスします。 ng-modelはこの関数呼び出しの結果を評価しないことに注意してください。

あなたの問題は、角度式の文字列として結果を返すことですが、評価することはないので、ng-modelには使用できない文字列が与えられます。これに対処するためにコードを再設計する方法はたくさんありますが、ng-initのようなものを使用して関数呼び出しの結果を取得し、その結果をng-モデル。簡単な例についてはこのフィドルを参照してください。http://jsfiddle.net/z5z9s/

+2

'ng-model =" {{scopeFunctionThatReturnsAString()}} "は動作するはずです。あなたはその事例を持っていますか? – Langdon

+0

@Langdonあなたは正しいです。それをキャッチするためにありがとう!私は私の答えを修正します。 – Jon7

+0

解決していただきありがとうございます。これ以上のものが用意されていない場合は、このままでよいかもしれません。あなたが説明しても気にしないなら、Angularのドキュメンテーションは 'ngModel - {文字列} - データにバインドするためのアサーション可能な表現式 'と言っています。私は、 'ng-model'指令では動作する関数を全く得ることができませんでした。 – adeelx

関連する問題