Help us understand the problem. What is going on with this article?

スコープを理解する

More than 5 years have passed since last update.

スコープ継承は単純で、あなたはそれが起きていることを知る必要さえない。子スコープの内部から、親スコープで定義されたプリミティブな値の 2wayデータバインディングを試すまでは。
https://github.com/angular/angular.js/wiki/Understanding-Scopes

プリミティブな値をng-modelにすると期待する動作しない場合がある

http://jsfiddle.net/akkunchoi/p46L9/

プリミティブ値だけじゃなく、親に未定義の値は親に反映されない

http://jsfiddle.net/akkunchoi/8McfP/

つまりスコープ継承はJavaScriptのプロトタイプ継承と同じ

子スコープに値がなければ親スコープを参照する。
プリミティブな値を保存すると子スコープに保存される。すると、親スコープの同名プロパティにはアクセスできなくなる。なぜなら子スコープにあるから。

子スコープでオブジェクトのプロパティだけを変更するなら、子スコープにはオブジェクトが未定義なので、強制的に親スコープを参照することができる。

この時注意しなければならないのは、子スコープに直接オブジェクトを代入してしまうこと。例えばこんな風に$scope.obj = {} 。子スコープで定義してしまうと、$scope.objで取得できるのは子の方。親で定義したプロパティは取得できなくなる。ちなみに子の方でdeleteすれば消せるそうです。

解決策

  • ng-modelには常に “.” を使用する。ng-model=“user.name”
  • 関数でやりとりする

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした