【问题标题】:Angular: Automatically update a scope reference to an object defined in a service?Angular:自动更新对服务中定义的对象的范围引用?
【发布时间】:2016-06-15 11:20:37
【问题描述】:

我有一个角度应用程序myApp和一个服务myService,持有一个对象data,由两个控制器使用,parentCtrlchildCtrl 后者继承自前者:https://jsfiddle.net/OleWahn/7ehLva10/2/

我通过$scope.data = myService.getData()parentCtrl 中引用data,这也使它可以从childCtrl 访问。

我在myService 的闭包中定义了data,因此$scope.data 只是对data 的引用。

因此,我可以在子控制器中更改data 的属性,并且每个人myServiceparentCrlchildCtrl 都会知道这些更改。到目前为止,一切顺利。

我的问题如下:如果我想覆盖整个data 对象,我在childCtrl 中调用myServices 方法setData

再次提醒大家,data 已更改。 $scope.data 但是仍然指向最初定义的对象,myService 不会通知 data 已更改,这将是我的最后一个问题:

有没有办法自动更新对服务中定义的对象的范围引用?

【问题讨论】:

    标签: javascript angularjs angularjs-scope angularjs-service


    【解决方案1】:

    使用angular.copy的目标参数

    angular.copy1

    用法

    angular.copy(source, [destination]);
    
    • 如果提供了目标,则会删除其所有元素(对于数组)或属性(对于对象),然后将源中的所有元素/属性复制到它。

    所以不要替换作用域引用,而是保留引用,清空它,然后用新内容填充它。

    function setData(newData) {
        //DO this
        angular.copy(newData, data);
        //Instead of this
        //data = newData;   
    }
    

    【讨论】:

    • 这比我想象的还要好,非常感谢!
    • 虽然它并没有回答我原来的问题,但我想我并没有把它说得很好。如果我想要 更改引用而不是交换对象的内容怎么办?举例来说,我有一个包含多个类似data 的对象的数组,我希望$scope.data 指向其中的任何一个。现在在childCtrl 中,我想通过myService 的设置器更改该指针 - 我怎样才能让$scope.data 知道该更改?
    • @razzamatazz 我不确定,如果这是你需要的,但也许你应该看看$broadcast。使用此功能,您可以“通知”控制器您的服务数据更改。我知道过度使用 $broadcast 不是一个好习惯,但也许它可以帮助你。
    • @doctor_Nick42 谢谢,这正是我要找的!我将在下面编辑我的答案以收集该问题的所有解决方案,但这要归功于您
    【解决方案2】:

    解决问题的两种不同方法:

    $广播

    此解决方案归功于 @doctor_Nick42:

    我在myServicesetData 方法中添加了一个$broadcast 并在parentCtrl 中捕获它,并相应地更新$scope.data

    查看更新的小提琴https://jsfiddle.net/7ehLva10/7/了解详情。

    使用函数

    找到一个可能的解决方案 - 我可以将 $scope.data 定义为一个函数 返回myService.getData(),即

    $scope.data = function() {
        return myService.getData();
    };
    

    这个解决方案的缺点是在视图中我需要将$scope.data 作为一个函数引用,即{{data()}}

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多