Javascript 为什么angularjs上下文只继承一级对象
在以下情况下,任何输入的更改都会导致所有输入的更改。 据我所知,这是因为数据对象对于所有3个作用域都是公共的Javascript 为什么angularjs上下文只继承一级对象,javascript,angularjs,inheritance,scoping,Javascript,Angularjs,Inheritance,Scoping,在以下情况下,任何输入的更改都会导致所有输入的更改。 据我所知,这是因为数据对象对于所有3个作用域都是公共的 <div class="content-container" ng-app=""> <input type="text" ng-model="data.message"> <h1>{{data.message}}</h1> <div ng-controller="FirstController"> <input t
<div class="content-container" ng-app="">
<input type="text" ng-model="data.message">
<h1>{{data.message}}</h1>
<div ng-controller="FirstController">
<input type="text" ng-model="data.message">
<h1>{{data.message}}</h1>
</div>
<div ng-controller="SecondController">
<input type="text" ng-model="data.message">
<h1>{{data.message}}</h1>
</div>
{{data.message}
{{data.message}
{{data.message}
但在以下情况下,每个作用域都有自己的消息对象:
<div class="content-container" ng-app="">
<input type="text" ng-model="message">
<h1>{{message}}</h1>
<div ng-controller="FirstController">
<input type="text" ng-model="message">
<h1>{{message}}</h1>
</div>
<div ng-controller="SecondController">
<input type="text" ng-model="message">
<h1>{{message}}</h1>
</div>
{{message}}
{{message}}
{{message}}
我不清楚,为什么要为每个范围创建“消息”对象,而不为每个范围创建“数据”对象?这两个例子之间的主要区别是什么?这不是关于AngularJS的工作原理,而是关于JavaScript的工作原理。考虑以下事项:
function Parent() {
this.message = '';
this.data = {};
}
function Child() {}; Child.prototype = new Parent();
如您所见,Parent
用作构造函数时,为新对象定义了两个属性。假设我们将使用第一个存储基元,第二个存储对象
Child
函数的定义非常简单:没有自己的属性,原型链中有Parent
对象。现在,让我们用它们做更多的事情:
var c = new Child();
c.message = '42';
c.data.message = '42';
console.log(c.hasOwnProperty('message')); // true
console.log(c.hasOwnProperty('data')); // false
console.log(c.data.hasOwnProperty('message')); // true
看到区别了吗?在第一种情况下,使用c.message
,我们在子对象(c
)本身上定义了一个新属性,该属性现在隐藏在其原型上定义的相同命名属性上
然而,在第二种情况下,我们仍然使用parent的属性,用一个新属性扩展它的值。c
上未定义新属性,仅影响其原型;这里的区别更能说明问题:
var d = new Child();
d.message = '34';
d.data.message = '34';
console.log(c.message); // still '42'
console.log(c.data.message); // now '34'
当您使用Angular指令时,也会发生类似的情况:定义了一个新的作用域,从其父作用域继承了所有“model”属性。但是,除非这些属性是“两级”的,否则分配给它们将在子级上引入相同的命名属性,从而隐藏为父级定义的属性
我建议研究Angular wiki上的文档:它对这种行为有更为实质性的解释(也有丰富的插图)。然而,这段引语很好地概括了这一点:
通过遵循以下步骤,可以轻松避免原语的此问题
ng模型中始终有“.”的“最佳实践”
对于确实只想使用原语的情况,它提到了一些变通方法:$parent.parentScopeProperty
是最直接的方法