2017-02-18 71 views
1

我的工厂服务有私有价值,但当我在一个实例中更新私有价值时,所有实例也都会更新。Angular工厂的私有价值

最新最好的方式来完成,如果没有更新所有实例:


angular.module('app').factory('instanceItem', function() { 
    var _valid = true; 
    var item = function (id,data){ 
    this.id = id; 
    this.data = data; 
    }; 
    item.prototype.setValid = function(bool) { 
    _valid = bool; 
    } 
    item.prototype.getValid = function() { 
    return _valid 
    } 
    return { item:item } 
}); 

什么我得到:

var itemA = new instanceItem.item(1,{}); 
var itemB = new instanceItem.item(2,{}); 
itemA.setValid(false); 
console.log(itemA.getValid()); 
//False 
console.log(itemB.getValid()); 
//False 

什么我找

var itemA = new instanceItem.item(1,{}); 
var itemB = new instanceItem.item(2,{}); 
itemA.setValid(false); 
console.log(itemA.getValid()); 
//False 
console.log(itemB.getValid()); 
//True 

回答

1

一项服务是一个单身人士。所以有一个唯一的_valid实例。 _valid应该是场项目:

var item = function (id,data){ 
    this.id = id; 
    this.data = data; 
    this._valid = true; 
    }; 
    item.prototype.setValid = function(bool) { 
    this._valid = bool; 
    } 
    item.prototype.getValid = function() { 
    return this._valid; 
    } 

或者,如果你真的想要把它变成私有(也使您的服务更自然的使用):

function createItem(id, data) { 
    var _valid = true; 

    return { 
     id: id, 
     data: data, 
     setValid: function(bool) { 
     _valid = bool; 
     }, 
     getValid: function() { 
     return _valid; 
     } 
    }; 
    } 
    return { createItem: createItem } 
+0

谢谢!我知道了。在第二种方法中,对象可能会变得非常复杂,私有方法将变得非常重要。不知道为什么Angular选择这个单身服务的时候,你可以使用.prototype来共享常用的方法。 谢谢JB。 –