スコープ継承は単純で、あなたはそれが起きていることを知る必要さえない。子スコープの内部から、親スコープで定義されたプリミティブな値の 2wayデータバインディングを試すまでは。
https://github.com/angular/angular.js/wiki/Understanding-Scopes
プリミティブな値をng-modelにすると期待する動作しない場合がある
プリミティブ値だけじゃなく、親に未定義の値は親に反映されない
つまりスコープ継承はJavaScriptのプロトタイプ継承と同じ
子スコープに値がなければ親スコープを参照する。
プリミティブな値を保存すると子スコープに保存される。すると、親スコープの同名プロパティにはアクセスできなくなる。なぜなら子スコープにあるから。
子スコープでオブジェクトのプロパティだけを変更するなら、子スコープにはオブジェクトが未定義なので、強制的に親スコープを参照することができる。
この時注意しなければならないのは、子スコープに直接オブジェクトを代入してしまうこと。例えばこんな風に$scope.obj = {}
。子スコープで定義してしまうと、$scope.obj
で取得できるのは子の方。親で定義したプロパティは取得できなくなる。ちなみに子の方でdelete
すれば消せるそうです。
解決策
- ng-modelには常に “.” を使用する。
ng-model=“user.name”
- 関数でやりとりする