在指令消化时捕获范围 - 远比console.log(范围)更详细

时间:2015-05-31 22:26:15

标签: javascript angularjs angularjs-directive angularjs-scope

我一直在使用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)发生了什么 - 它究竟向我展示了什么,为什么两者不同?

感谢任何帮助。谢谢!

以下是两个输出的示例:

the more verbose scope is the first output.

我注意到他们有不同的原型,但不确定从中得到了什么。因此,对于指令范围内实际可用的内容,它有点模糊。

1 个答案:

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