无法从自定义服务返回对AngularJS范围的引用

时间:2014-02-14 08:00:51

标签: javascript angularjs angularjs-scope angular-services

情景......

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

解决方案......

构建一个实用程序服务,该服务承载您传递当前作用域的函数以及要查找的属性的名称。这将以递归方式查找当前作用域的父链,直到找到要查找的属性“hasOwnProperty”的作用域。然后它将返回对该范围的引用。

结果......

当我从控制台运行服务时,我得到一些奇怪的行为。我有一些console.log 跟踪服务有效性的标记。每个日志输出都是完美的,完全符合您的预期,即使是在返回语句日志之前的console.log,也就是您期望的对象,对象,但是...返回语句返回“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;
            }
        }
    }

}]);

有关范围未归还原因的任何想法?

提前致谢:)

修改

感谢Geoff的回答!!

关于invarni的建议,如果我试图为当前范围提供一个值而不“隐藏”祖父母的那个,那么肯定会有效。然而,问题是,祖父母范围将是应用程序中许多其他范围的祖父母。我需要在一个后代范围内对数据进行任何更新,这些范围可用于不同视图中的其他后代范围。所以我的想法是,如果我改变祖父的范围,它将持续存在,并且由于原型继承可用于其他后代范围。如果有人知道更好的方法或看到这个概念的缺陷,请告诉我!!

再次感谢您的反馈!

2 个答案:

答案 0 :(得分:2)

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

 console.log("property not found on " + scope.$id);
 return this.findPropertyOwner(scope.$parent, propertyName);

答案 1 :(得分:2)

  

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

好像你可能过于复杂了。如果你看一下Angular中的scope inheritance如何工作,你会发现你可以通过创建你希望你的孙子范围能够改变祖父范围内对象属性的变量来解决你的问题。而不是直接在祖父母范围内将其作为财产。这是使用类似$scope.model.myProp而不是$scope.myProp的东西,然后子范围将不会创建自己的属性。