24

https://github.com/angular/angular.js/wiki/Understanding-Scopesによると、に接続されたプリミティブにデータバインドしようとするのは問題$scopeです:

スコープの継承は通常簡単で、多くの場合、それが起こっていることを知る必要さえありません... プリミティブ (数値、文字列、 boolean) 子スコープ内から親スコープで定義されます。ほとんどの人が期待するようには機能しません。

おすすめは

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


今、私はこれらのルールに違反するこの非常に単純なセットアップを持っています:

HTML:

<input type="text" ng-model="theText" />
<button ng-disabled="shouldDisable()">Button</button>

JS:

function MyController($scope) {
    $scope.theText = "";
    $scope.shouldDisable = function () {
         return $scope.theText.length >= 2;
    };
}

これは本当に悪いことですか?どういうわけか、子スコープを使用しようとすると、これは恐ろしい方法で私を台無しにするのでしょうか?


次のようなものに変更する必要がありますか

function MyController($scope) {
    $scope.theText = { value: "" };
    $scope.shouldDisable = function () {
         return $scope.theText.value.length >= 2;
    };
}

<input type="text" ng-model="theText.value" />
<button ng-disabled="shouldDisable()">Button</button>

ベストプラクティスに従うには?前者に存在する恐ろしい結果から後者が私を救う具体的な例を教えてください。

4

2 に答える 2

6

スコープ M、A、B があり、M が A と B の両方の親であるとします。

(A,B) のいずれかが M のスコープに書き込もうとすると、非プリミティブ型でのみ機能します。この理由は、非プリミティブ型が参照によって渡されるためです。

一方、プリミティブ型はそうではないため、theTextM のスコープに書き込もうとすると、M に書き込む代わりに、A または B のスコープにそれぞれ同じ名前の新しいプロパティが作成されます。A と B の両方がこのプロパティに依存している場合、エラーが発生します。これは、どちらも他の人が何をしているのかを認識しないためです。

于 2013-06-18T21:18:40.810 に答える