我有以下名为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'
};
};
但肯定这是不好的做法?
答案 0 :(得分:1)
不要重新分配整个对象,也不要破坏对原始对象的引用
给出以下简单示例:
var a ={name:'foo'}, b=a;
您可以更改name
属性:
a.name = 'bar'
// or
b.name = 'bar'
a.name
和b.name
的值无论如何都会相同。
但如果您通过执行以下操作更新a
:
a = {name: 'bar'}
您已为a
分配了一个完全不同的对象,并且破坏了对原始对象的引用。现在a
和b
未引用相同的对象,因此对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 });