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

标签 javascript angularjs angularjs-scope angular-services

场景...

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

解决方案...

构建一个实用程序服务,该服务托管一个函数,您可以向该函数传递当前作用域和要查找的属性的名称。这将递归查找当前作用域的父链,直到找到正在查找的属性“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/

相关文章:

javascript - React Redux 表单 2 使用 onSubmit 和重定向提交

javascript - 在 Angular 中编译 HTML 字符串模板

javascript - 在 AngularJS 中创建和访问全局常量

javascript - 带 Material 的 Angular 形

javascript - ExtJS4 - 工具提示不显示列值

javascript - 使用 $httpBackend 和 $scope.$watch 对 Angular.js 进行单元测试

javascript - 我可以将参数传递给使用 _.lodash 去抖动的函数吗?

javascript - 带有 protractorjs 的 Angular 2 失败 : Error while waiting for Protractor to sync with the page: "window.getAllAngularTestabilities is not a function"

javascript - AngularJS,如何使用服务捕获 HTTP 数据并将其绑定(bind)到我的 Controller ?

javascript - 如何将JS事件更改保存到浏览器历史记录中