更正像AngularJS中的工厂一样的单身人士的正确方法

时间:2015-10-13 21:21:26

标签: angularjs angularjs-scope angularjs-factory

我有以下名为MapController的控制器 MapController.js

var self = this;
self.factory = MapStateFactory;
self.origin = self.factory.originCity;
self.destination = self.factory.destinationCity;

//The wrong way
//Updating self.origin will shadow the value and will no longer point to the factory
self.changeOrigin = function () {
    self.origin = {
        name: 'New Origin'
    };
};

//However, this is still incorrect. 
//It popluates the change in the factory but if I output self.destination on the page, it hasnt updated
self.changeDestination = function () {
    //This also doesn't update both locations if I use
    //MapstateFactory.destinationCity = ''
    self.factory.destination = {
        name: 'New Destination'
    };
};

如果您只是假设我的工厂是标准工厂,没有有趣的业务,我如何使用这些功能正确更新工厂(如果有意义的话,它们会附加到按钮上)。

这是我目前正在努力解决的问题。 我遇到的唯一解决方案是使用MapStateFactory.originCity 的值进行监视,这看起来非常混乱......

我可以做一些像

这样的事情
self.changeDestination = function () {
   self.destination = {
       name: 'New Destination'
   };
   self.factory.destinationCity = {
       name: 'New Destination'
   };
};

肯定这是不好的做法?

1 个答案:

答案 0 :(得分:1)

不要重新分配整个对象,也不要破坏对原始对象的引用

给出以下简单示例:

var a ={name:'foo'}, b=a;

您可以更改name属性:

a.name = 'bar' 
// or
b.name = 'bar'

a.nameb.name的值无论如何都会相同。

但如果您通过执行以下操作更新a

a = {name: 'bar'}

您已为a分配了一个完全不同的对象,并且破坏了对原始对象的引用。现在ab未引用相同的对象,因此对a属性所做的更改不会影响b属性

在您的情况下,您需要更改:

self.factory.destination = {
    name: 'New Destination'
};

要:

self.factory.destination.name = 'New Destination' ;

或者对于具有多个属性的更大更改,您可以使用angular.extend()

等方法
angular.extend(self.factory.destination, {name: 'New Destination', cost:500  });