親スコープのオブジェクトプロパティを参照する代わりに、$parentを使用して親スコープのプリミティブにアクセスすることもできます。
<input ng-model="$parent.testvalue" />
ng-includeは子スコープを作成します。そのスコープは、通常、Ctrlの親スコープから継承します。3つのバリエーションの仕組みは次のとおりです。
- $ parent.testvalueは、モデルを親スコープのプロパティに関連付けます
- testvalue自体は、モデルを子スコープで作成される新しいプロパティに関連付けます。このプロパティは、同じ名前で親スコーププロパティを「シャドウ/非表示」にします。
- foo.testvalue(たとえば、@ dnc253の回答を参照)も、モデルを親プロパティに関連付けます。これは次のように機能します。Javascriptは子スコープで「foo」を認識/検索しないため、親スコープで検索し(プロトタイプの継承のため)、そこで検索します。
子スコープがどのように見えるかを確認するには、元のフィドルを使用して、このコードをテンプレートのどこかに追加します。
<a ng-click="showScope($event)">show scope</a>
そして、このコードをCtrlに追加します。
$scope.showScope = function(e) {
console.log(angular.element(e.srcElement).scope());
}
テキストボックスに入力する前に、[スコープを表示]リンクをクリックします。コンソール(私はChromeを使用しています)で、「子」スコープを展開して、まだtestvalueプロパティが含まれていないことを確認できます(「初期値」がどのように表示されているかわからないため、驚くべきことです。テキストボックス内)。$ parentを展開すると、そこにtestvalueプロパティが表示されます。この名前のプロパティは、現時点では親スコープにのみ存在するように見えます。
次に、コンソールをクリアし、テキストボックスに入力して、[スコープの表示]リンクをもう一度クリックします。「子」スコープに新しいtestvalueプロパティが追加されたことがわかります。親プロパティをシャドウ/非表示にします。したがって、子スコープ内のものは子スコープtestvalueプロパティを参照し、親スコープ内のものは親スコープtestvalueプロパティを参照します。
更新:参考までに、私は最近、スコープのプロトタイプの継承に関する広範な回答/記事を書きました。これは、上記の概念をより詳細に説明し、多くの写真を掲載しています。AngularJSのスコープのプロトタイプ/プロトタイプの継承のニュアンスは何ですか?