0

情节...

我需要更新存储在当前作用域的祖父作用域的属性中的数据。当然,如果我尝试简单地写入该属性,它不会更新祖父作用域,而是将属性添加到当前作用域。

解决方案 ...

构建一个实用程序服务,该服务托管一个函数,您将当前范围和您正在寻找的属性的名称传递给该函数。这将递归查找当前范围的父链,直到找到正在查找的属性的“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 的建议,如果我试图使一个值可用于当前范围而不“隐藏”祖父母的值,它肯定会起作用。然而,问题是祖父母范围将是应用程序中许多其他范围的祖父母。我需要对不同视图中的其他后代范围可用的一个后代范围中的数据进行任何更新。所以想法是,如果我更改祖父范围,它将持续存在,并且由于原型继承可用于其他后代范围。如果有人知道更好的方法或看到这个概念的缺陷,请告诉我!!

再次感谢你的反馈!

4

2 回答 2

2

我需要更新存储在当前作用域的祖父作用域的属性中的数据。当然,如果我尝试简单地写入该属性,它不会更新祖父作用域,而是将属性添加到当前作用域。

看起来你可能过于复杂了。如果您了解 Angular 中的作用域继承是如何工作的,您会发现您可以通过使您希望孙作用域能够更改祖父母作用域上对象的属性而不是拥有的变量来解决您的问题它直接作为祖父母范围的属性。那就是使用类似的东西$scope.model.myProp而不是$scope.myProp然后子范围不会创建自己的属性。

于 2014-02-14T08:12:17.673 回答
2

您需要返回递归函数的结果:

 console.log("property not found on " + scope.$id);
 return this.findPropertyOwner(scope.$parent, propertyName);
于 2014-02-14T08:03:43.847 回答