这个问题的灵感来自:


  ng-model in numeric input does not affect scope


在这个问题中,我惊讶地得知即使我每个模板都只有一个控制器并且没有自定义指令,我还是嵌套了控制器。这可能与Ionic有关。

我有一个问题,如果不将它们包装在对象中,就无法访​​问原始的$ scope属性。无论我如何命名原始属性,我都遇到了这个问题。如果将其包装在一个对象中或引用了$ parent,则只能从模板中访问它。

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

最佳答案

访问与定义值

当访问一个值时(例如使用{{value}}或method()),应用程序将爬升父级作用域以寻找该值,直到达到$ rootScope:然后使用找到的第一个版本(如果有)。

但是,在定义值时(例如使用value ='foo'),即使在父作用域下具有相同键的值存在,它也会将其应用于当前作用域。

定义原语与定义对象属性

设置诸如“值”之类的原始值时,您只需定义什么值即可:

value = 123;


但是,在定义对象的属性时,必须先访问对象,然后才能将属性更改应用于对象:

object.value = 123;


上面的代码查找对象,并将更改应用于其value属性。如果对象在当前作用域中不存在,则应用程序将搜索父作用域以查找对象,以便可以访问它。然后,对值的更改将应用​​于该对象的实例。如果对象根本不存在,则代码将引发错误,因为它实质上是以下内容:

null.value = 123;




通过原型继承,可以在原始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 - 我必须将$ scope原语包装在对象中,但是可以使用函数而无需将其包装。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33831411/

10-11 12:33
查看更多