控制台中的Angular:获取我创建的范围(不是整个范围)

时间:2015-07-22 18:52:03

标签: javascript angularjs console

我知道我是否

angular.element(document.querySelector('<selector-name>')).scope()

我可以获得范围。但这给了我一切($$ childTail,$$ childHead等)。

是否有一种方法只能给我在控制器上创建的$ scope元素(变量和函数)?

2 个答案:

答案 0 :(得分:1)

据我所知,一个选项几乎可以提供这些属性,即获取您检索的范围(通过angular.element(/*...*/).scope())和该范围原型的差异。

这是一个样本函数:

function getAssignedScopeProperties(targetScope){
    var targetProto = Object.getPrototypeOf(targetScope);

    var assignedProperties = {};
    for (var prop in targetScope) {
        if (targetScope.hasOwnProperty(prop) && typeof targetProto[prop] === "undefined") {
            assignedProperties[prop] = targetScope[prop];
        }
    }
    return assignedProperties;
}

然后使用函数:

var targetElement = angular.element(document.querySelector('<selector-name>'));
var targetProps = getAssignedScopeProperties(targetElement.scope());

不幸的是,在Angular 1.3.15中,这似乎留下了$$watchersCount属性。这在版本1.3.14和1.3.16中都不会发生,因此它可能是AngularJS中1.3.15版的错误。

那就是说,保持警惕$$watchersCount(或黑名单)以防止Angular的版本出现这样的错误并不适合我。确保不会发生这种情况的另一个选择是在内部if中包含prop.charAt(0) !== "$"的检查,但假设目标是保留在控制器中分配的所有值,删除控制器中的任何值从$开始定义肯定是错误的(当然,构建控制器的人分配给以$开头的属性也是错误的,但这既不是在这里也不是在那里。

答案 1 :(得分:0)

较早的问题,未接受的答案here

简短回答是否,angular不提供仅获取用户创建的属性的方法。另外,将$ scope对象复制甚至转换为JSON有点困难。

稍微长一点的答案是你可以创建一个自定义的JSON.stringify函数来解析$ scope对象。

var cleanScope = function(scope, includeFunctions) {
    // custom JSON.stringify function
    // borrowed from: https://stackoverflow.com/questions/24806495/how-to-get-plain-object-from-scope-in-angularjs
    function scopeStringify(key, value) {
        // ignore any key start with '$',
        // and also ignore 'this' key to avoid a circular reference issue.
        if (typeof key === 'string' && (key.charAt(0) === '$' || key === 'this')) {
            return undefined;
        }

        // by default, JSON.stringify will ignore keys with a function as a value
        // pass true as the second param to get back 'function' instead of ignoring
        return includeFunctions && typeof value === 'function' ? 'function' : value;
    }

    return angular.fromJson(JSON.stringify(scope, scopeStringify));
};

// call like so:
console.log('clean $scope: ', cleanScope($scope));

// or pass true as the second param to include functions
console.log('clean $scope: ', cleanScope($scope, true));