我必须在对象中包装$ scope基元,但可以使用函数而不包装它们。为什么呢?

时间:2015-11-20 16:23:23

标签: javascript angularjs ionic

这个问题的灵感来自:

  

ng-model in numeric input does not affect scope

在那个问题中,我很惊讶地发现,即使我每个模板只有一个控制器而且我没有自定义指令,我也会嵌套控制器。这可能与Ionic有关。

我遇到了一个问题,即我无法访问原始的$ scope属性而不将它们包装在对象中。无论我将原始属性命名为什么,我都遇到了这个问题。如果我将它包装在一个对象中或者引用$ parent。我只能从我的模板中访问它。

为什么我无法访问基元而不管名字?我会理解可能存在命名冲突,但没有名称有效。如果没有名称可行,那为什么包裹在对象中的原语有效呢?为什么我不需要在模板中编写$parent.object来访问附加到$scope的对象?

2 个答案:

答案 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

一起使用