这个问题的灵感来自:
在那个问题中,我很惊讶地发现,即使我每个模板只有一个控制器而且我没有自定义指令,我也会嵌套控制器。这可能与Ionic有关。
我遇到了一个问题,即我无法访问原始的$ scope
属性而不将它们包装在对象中。无论我将原始属性命名为什么,我都遇到了这个问题。如果我将它包装在一个对象中或者引用$ parent。我只能从我的模板中访问它。
为什么我无法访问基元而不管名字?我会理解可能存在命名冲突,但没有名称有效。如果没有名称可行,那为什么包裹在对象中的原语有效呢?为什么我不需要在模板中编写$parent.object
来访问附加到$scope
的对象?
答案 0 :(得分:2)
访问与定义值
访问某个值(例如使用 {{value}} 或方法())时,应用程序将爬上父作用域以查找该值,直到它为止到达$ rootScope:然后使用找到的第一个版本(如果有的话)。
但是,在定义值时(例如使用 value =' foo' ),它会将其应用于当前范围,即使存在具有相同键的值也是如此父范围。
定义基元与定义对象属性
设置原始值(例如' value')时,您只需定义值:
value = 123;
但是在定义对象的属性时,必须先访问该对象,然后才能对其应用属性更改:
object.value = 123;
上面的代码查找对象,并将更改应用于其value属性。如果当前作用域中不存在对象,则应用程序将搜索父作用域以查找对象,以便它可以访问它。然后,对值的更改将应用于该对象实例。如果对象根本不存在,代码将抛出错误,因为它基本上如下:
null.value = 123;
示例强>
类似的功能可以通过原型继承在vanilla Javascript中看到。
var parent = { primitive: 123, object: { value: 123 } };
var child = Object.create(parent);
console.log(child.primitive); // 123, from parent
console.log(child.object.value); // 123, from parent
child.primitive = 456; // modifies own primitive key
console.log(child.primitive); // 456, from self
console.log(parent.primitive); // still 123
child.object.value = 456; // modifies parent's object's value
console.log(child.object.value); // 456, from parent
console.log(parent.object.value); // 456, since it was modified above
答案 1 :(得分:1)
JavaScript对象是动态的" bags"属性(简称 自己的财产)。 JavaScript对象具有指向原型对象的链接。 尝试访问对象的属性时,属性不会 只能在物体上寻找但是在物体的原型上, 原型的原型,等等,直到有一个属性 找到匹配的名称或达到原型链的末尾。
<强> Read more here 强>
你需要首先了解javascript的原型继承。
然后了解范围如何与这个非常有用的 guide 。
一起使用