[英]Unable to return a reference to an AngularJS scope from a custom service
场景...
我需要更新存储在作为当前作用域的祖父母的作用域的属性中存储的数据。当然,如果我尝试简单地写入该属性,则不是在更新祖父母作用域,而是在当前作用域中添加一个属性。
解决方案 ...
若要构建实用程序服务来承载一个函数,您可以将当前范围和要查找的属性的名称传递给该函数。 这将递归查找当前作用域的父链,直到找到要查找的属性的“ hasOwnProperty”作用域。 然后它将返回对该范围的引用。
结果...
当我从控制台运行服务时,会出现一些奇怪的行为。 我有一些console.log标记,这些标记可跟踪服务的有效性。 每个日志输出都是完美的,并且完全符合您的期望,即使是return语句即将记录之前的console.log,也可以按您期望的那样输出到控制台,但是... return语句返回“ undefined” ... ?? ?
这是服务代码...
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的建议,如果我试图将一个值提供给当前范围而不将其“隐藏”在祖父母的父母那里,那么它肯定会起作用。 但是要注意的是,祖父母范围将成为应用程序中许多其他范围的祖父母。 我需要对一个后代范围中的数据进行的任何更新,这些更新可用于不同视图中的其他后代范围。 因此,我的想法是,如果我更改祖父母范围,它将继续存在,并且由于原型继承而可用于其他后代范围。 如果有人知道更好的方法或看到此概念的缺陷,请告诉我!
再次感谢你的反馈!
您需要返回递归函数的结果:
console.log("property not found on " + scope.$id);
return this.findPropertyOwner(scope.$parent, propertyName);
我需要更新存储在作为当前作用域的祖父母的作用域的属性中存储的数据。当然,如果我尝试简单地写入该属性,则不是在更新祖父母作用域,而是在当前作用域中添加一个属性。
看来您可能使这一过程复杂化了。 如果您查看Angular中范围继承的工作方式,您会发现可以通过使您的孙子范围能够更改祖父母范围上的对象的属性的变量来解决问题,而不必它直接作为祖父母范围的属性。 那是使用$scope.model.myProp
类的东西,而不是$scope.myProp
,然后子作用域将不会创建自己的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.