2014-01-31 93 views
0

我从这个网站阅读文章的时候弄糊涂了嵌套的范围(陷阱#5):很难理解在AngularJs

http://thenittygritty.co/angularjs-pitfalls-using-scopes

http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html

我的问题是:

  1. 这个场景非常类似于两个在普通js中有相同名称的变量,一个在本地定义(例如在嵌套函数中)并且在e全球定义(例如windows.onload),所以本地的总是覆盖全球?

  2. 我有点理解$ scope.variable应该引用一个包含值的模型,但是如果它们具有相同的名称而不考虑点语法,它并不会真正影响结果。我不明白,如果把“。”点会导致上面的OUTPUT VALUE中的差异。例如,用{{user.name}}替换它们。这个最佳实践如何工作?

从网站下面的代码试图在于向世人证明如果第二{{名}}的变化,第{{名}}不会改变。

HTML:

<span>Outside Controller: Your name is: {{username}}</span> 
<div ng-controller="SignupController"> 
    <span>Inside Controller: Your name is: {{username}}</span> 
    <fieldset legend="User details"> 
    <input ng-model="username" /> 
    </fieldset> 
</div> 

JS:

var app = angular.module('app', []); 
app.controller('SignupController', function($scope){}); 
+1

对这个wiki的范围继承概念仍然没有更好的解释https://github.com/angular/angular.js/wiki/Understanding-Scopes – Chandermani

回答

2

它的工作原理就像在JavaScript原型继承。现在

function Jedi(){} 
Jedi.prototype.name = 'Luke'; 

,如果你这样做:

var obiwan = new Jedi(); 
console.log(obiwan.name); //Luke 

但是,如果我这样做:

var obiwan = new Jedi(); 
obiwan.name = 'Obi-wan'; 
console.log(obiwan.name); //Obi-wan 

var luke= new Jedi(); 
console.log(luke.name); //Luke 

这是JavaScript的方式解决性能。当读取一个属性时,它首先在对象中查找它,如果没有找到它,它就会在它的原型中查找它,如果没有找到它,它将在它的原型的原型中查找它,等等,直到它到达原型链的顶部(如果没有找到)。

但是,在编写属性时,如果对象还没有给定的字段,那么会创建该属性,并且从此刻开始,根据上面解释的搜索标准,您在阅读时得到的值是直接在该对象,而不是其原型。

在angular中建议的解决方案是将模型数据不直接存储为作用域中的字段,而是作为对象来避免此行为。例如:

function Jedi() 
Jedi.protype.data = {name: 'Luke'}; 

var obiwan = new Jedi(); 
obiwan.data.name = 'Obi-wan'; 

var luke= new Jedi(); 
console.log(luke.data.name); //Obi-wan 

这次下原型继承领域是data,所以所有的对象共享。

+0

我开始在你的示例和Angularjs范围之间建立连接遗产。奇怪的是,我在学习Js Oop时错过了你的例子,如果它们是原始值,你不能改变它,但是当原型属性是一个对象时它是可能的。我猜你可以改变原型属性的唯一原因只是因为.data指向一个对象(即存储在堆栈中的引用)? – Charles

+0

本书[适用于Web开发人员的专业JavaScript](http://www.amazon.com/Professional-JavaScript-Developers-Nicholas-Zakas/dp/1118026691/ref=sr_1_1?ie=UTF8&qid=1391168315&sr=8-1&keywords=professional + javascript + for + web +开发人员)对我所读过的主题有最好的解释。看看你能否得到一份副本。是的,在我的最后一个例子中,两个对象共享同一个“数据”实例的引用,很可能在堆内存区域(不太可能在堆栈中)。 –

+0

Ur在堆上。从我上次评论中错过。现在,角度范围是有道理的。谢谢。 – Charles