2017-02-18 70 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。 –