Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么angularjs上下文只继承一级对象_Javascript_Angularjs_Inheritance_Scoping - Fatal编程技术网

Javascript 为什么angularjs上下文只继承一级对象

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

在以下情况下,任何输入的更改都会导致所有输入的更改。 据我所知,这是因为数据对象对于所有3个作用域都是公共的

<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
是最直接的方法