我一直在使用scope: false
的指令来调查可以访问其父级范围的指令的可用内容 - 我刚才意识到在链接函数中执行console.log(scope)
已经有点了误导。
.directive('directive', function() {
return {
scope: false;
link: function (scope, elem, attrs) {
console.log(scope);
console.log($.extend({}, scope));
}
});
后者console.log($.extend({}, scope));
是一个更加冗长的对象,我认为这是在$digest
阶段记录的,(作为其中一个属性,$$phase
,值$digest
:- P)。
console.log($.extend({}, scope));
还包括我希望从父作用域访问的对象,如父作用域上的对象,它们不会出现在console.log(scope)
的输出中。
所以我现在假设console.log($.extend({}, scope));
- 实际上在指令的链接函数中包含scope
可用的内容。
无论如何,console.log(scope)
发生了什么 - 它究竟向我展示了什么,为什么两者不同?
感谢任何帮助。谢谢!
以下是两个输出的示例:
我注意到他们有不同的原型,但不确定从中得到了什么。因此,对于指令范围内实际可用的内容,它有点模糊。
答案 0 :(得分:1)
这与$摘要无关。
var verboseObject = $.extend({}, scope);
console.log(verboseObject);
上面的内容比较详细,因为Angular的Scope
原型(scope
继承自)的所有属性都被复制到verboseObject
。这就是jQuery的$.extend
的工作方式:
http://api.jquery.com/jquery.extend/
从对象原型继承的属性将通过
复制
由于这些属性不在verboseObject
原型上,而是在对象本身上,因此开发人员工具只是将其显示为扁平对象。
console.log(scope);
在上述情况下,$digest
,$apply
,$eval
等所有“缺失”属性仍然可以在scope
上使用,就在原型的更上方链。在Developer Tools中,您可以通过展开对象的__proto__
属性来检查原型链。您可能需要上次几次才能达到Scope
继承的实际scope
。