我必须将$scope基元封装在对象中,但可以在不封装它们的情况下使用函数.为什么?



这个问题的灵感来自:

数值输入中的ng模型不影响范围

在这个问题中,我惊讶地发现,尽管每个模板只有一个控制器,而且没有自定义指令,但我还是有嵌套的控制器。这可能与Ionic有关。

我遇到了一个问题,如果不将基元$scope属性封装在对象中,我就无法访问它们。不管我将原始属性命名为什么,我都会遇到这个问题。只有当我将它包装在对象中或引用$parent时,我才能从模板中访问它。

为什么无论名称如何,我都无法访问基元?我理解可能存在命名冲突,但没有任何名称起作用。如果没有名字有效,那么为什么包裹在对象中的基元有效呢?为什么我不需要在模板中写入$parent.object来访问附加到$scope的对象?

访问值与定义值

访问值时(例如使用{{value}}method()),应用程序将向上爬以查找该值,直到它到达$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

JavaScript对象是属性的动态"袋子"(称为自有财产)。JavaScript对象有一个到原型对象的链接。尝试访问对象的属性时,该属性不会只在对象上寻找,但在对象的原型上原型的原型,依此类推,直到具有找到匹配的名称或到达原型链的末尾。

点击此处阅读更多

您需要首先了解javascript的原型继承。

然后了解scope如何使用这个非常有用的指南

最新更新