我知道我是否
angular.element(document.querySelector('<selector-name>')).scope()
我可以获得范围。但这给了我一切($$ childTail,$$ childHead等)。
是否有一种方法只能给我在控制器上创建的$ scope元素(变量和函数)?
答案 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));