9

関連記事、しかし助けにはならなかった: ディレクティブから ngModel を設定するときのスコーピングの問題

編集:分離スコープで ng-model を使用できますか? どちらも機能しませんでした。

私はいくつかの問題を抱えていましたが、より複雑な方法で推測しています。データの保存に入力を一切使わないプルダウンを書きたいです。私はむしろそれを処理するために ngModel を持っています。

http://jsfiddle.net/QeM6g/6/

上記の jsFiddle の例は、上記の方法が機能しなかったデモを示しています。

// this is what should work but doesn't
ngModel.$setViewValue(value);
scope.$apply(attr.ngModel,value);

何らかの理由で、ngModelController のスコープは私のスコープの兄弟です。そのため、変更が親に戻されません。少なくとも他のすべての兄弟スコープは、期待どおりに動作します。つまり、ng-change は組み合わせて機能します。

4

2 に答える 2

23

Angularjs は、プリミティブ型への直接バインディングをうまく処理できません。

この行を変更した場合:

$scope.productId = 16;

このようなものに:

$scope.selectedProduct = {
    id: 16
}

コードの残りの部分でこれらの参照を変更すると、問題を解決できるはずです。

jsFiddle: http://jsfiddle.net/M2cL7/

于 2013-01-29T10:55:39.947 に答える
7

スコープ内のプリミティブにバインドしないでください。スコープ内のオブジェクトにバインドしてください。

https://github.com/angular/angular.js/wiki/Understanding-Scopesから

...子スコープ内から親スコープで定義されたプリミティブ(数値、文字列、ブール値など)への双方向データバインディング(つまり、フォーム要素、ng-model)を試みるまで。ほとんどの人が期待するようには機能しません。子スコープは、同じ名前の親プロパティを非表示/シャドウにする独自のプロパティを取得します。これは AngularJS が行っていることではありません。これが JavaScript のプロトタイプの継承のしくみです。新しい AngularJS 開発者は、多くの場合、ng-repeat、ng-switch、ng-view、および ng-include のすべてが新しい子スコープを作成することに気付いていないため、これらのディレクティブが関係している場合に問題が発生することがよくあります。

プリミティブに関するこの問題は、常に「.」を使用するという「ベスト プラクティス」に従うことで簡単に回避できます。あなたのngモデルで

それで

<input ng-model="tweetText">

になる

<input ng-model="tweet.text">

素晴らしい要約はここにあります:

https://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=30m

于 2016-05-31T18:05:16.000 に答える