【问题标题】:Angular 1: service variable getting updated via controllerAngular 1:通过控制器更新服务变量
【发布时间】:2017-10-04 05:27:48
【问题描述】:

我以前也这样做过,但这次不知道出了什么问题。

一项服务:

angular.module('module')
  .service("BaseService", function() {
    var vm = this;
    var testValue = {a:1,b:2};
    vm.getTestValue = function(){
        return testValue;
    }
  });

控制器中的方法:

vm.getTest = function(){
      console.log(BaseService.testValue) // undefined - cool
      console.log(BaseService.getTestValue()) //{a: 1, b: 2} - cool
      var value = BaseService.getTestValue();
      console.log(value) // {a: 1, b: 2} - cool
      value.a = 20; // updated local object
      console.log(value) // {a: 20, b: 2} -cool
      console.log(BaseService.getTestValue())-- {a: 20, b: 2} -- ??? why
}

希望我的问题很清楚,为什么局部变量会在服务中更新,如果它的行为是这样的..在服务/工厂中获取设置功能的正确方法是什么....对功能进行原型设计会更好吗?在 vm 中附加函数。

【问题讨论】:

    标签: javascript angularjs angular-services angular-factory


    【解决方案1】:

    您在服务中的变量 (testValue) 是属于 reference types 的对象。当您在控制器中使用它时,它只获得引用,对象保持不变。您实际上有 2 个对同一个对象的引用,因此通过其中一个引用更改它的属性会影响 object。所以你得到了改变的对象。

    想象一个有两扇门的房间。这里的门是你的参考,房间是对象本身。当你从一扇门进来,改变房间里的东西,然后从另一扇门进来,你就能看到房间里的变化。

    如果不想获取当前对象,可以在函数中copy对象并返回副本。

    vm.getTestValue = function() {
        return angular.copy(testValue);
    }
    

    【讨论】:

    • 谢谢Suren ....这就是我正在做的替代方案...但想知道处理这些对象的最佳方法...并感谢房间的例子.. .它非常创新且易于记忆
    • 如果你不需要改变你的对象,你必须使函数不可变,所以你需要返回副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2019-07-13
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多