场景...
我需要更新存储在当前作用域的祖父作用域的属性中的数据。当然,如果我尝试简单地写入该属性,它不会更新祖父作用域,而是将属性添加到当前范围。
解决方案...
构建一个实用程序服务,该服务托管一个函数,您可以向该函数传递当前作用域和要查找的属性的名称。这将递归查找当前作用域的父链,直到找到正在查找的属性“hasOwnProperty”的作用域。然后它将返回对该范围的引用。
结果...
当我从控制台运行服务时,我遇到了一些奇怪的行为。我有一些console.log 追踪服务有效性的标记。每个日志输出都是完美的,完全符合您的期望,甚至在 return 语句日志之前的console.log,到控制台,如您所期望的对象,但是... return 语句返回“未定义”...? ?
这是服务代码...
angular.module("app.services", [])
.factory('UtilitiesService', [function () {
return {
findPropertyOwner: function (scope, propertyName) {
console.log("Looking at $scope.$id = " + scope.$id);
if (!scope.hasOwnProperty(propertyName) && scope.$parent != null) {
console.log("property not found on " + scope.$id);
this.findPropertyOwner(scope.$parent, propertyName);
} else {
console.log("found on " + scope.$id);
console.log(scope);
return scope;
}
}
}
}]);
对于为什么范围没有被返回有什么想法吗?
提前致谢:)
编辑
感谢杰夫的回答!
关于 invarni 的建议,如果我试图为当前范围提供一个值而不“隐藏”祖 parent 上的值,那么它肯定会起作用。然而,问题是祖 parent 作用域将是应用程序中许多其他作用域的祖 parent 。我需要对一个后代范围中的数据进行任何更新,以供不同 View 中的其他后代范围使用。所以这个想法是,如果我更改祖 parent 范围,它将持续存在,并且由于原型(prototype)继承可用于其他后代范围。如果有人知道更好的方法或发现这个概念有缺陷,请告诉我!!
再次感谢您的反馈!
最佳答案
您需要返回递归函数的结果:
console.log("property not found on " + scope.$id);
return this.findPropertyOwner(scope.$parent, propertyName);
关于javascript - 无法从自定义服务返回对 AngularJS 范围的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21773780/