2015-12-27 30 views
0

我正在使用Angular服務跟蹤某些按鈕的狀態以及是否應顯示它們。我在第一次分配後遇到了問題,我無法更改該值。初始分配後無法獲取我的服務值更新

app.service('EntityButtonStateService', function(){ 

    var state = { 
     showDelete: false, 
     showNew: false 
    }; 

    this.getState = function(){ 
     return state; 
    }; 
}); 

在我的控制器:

var buttonState = EntityButtonStateService.getState(); 

table.on('select', function(e, dt, node, config) { 
    var id = getSelectedRowId(dt); 

    buttonState.showDelete = true; //this assignments works 
    buttonState.showNew = true; 
}); 
table.on('deselect', function(e, dt, node, config) { 
    buttonState.showDelete = false; //this assignment does not work 
    buttonState.showNew = true; 

}); 

什麼可能我是做錯了什麼?

+0

我建議設立一個小提琴(如代碼應該是相當簡潔),作爲將使修復更容易。 –

+0

我也投票添加一個小提琴 –

回答

1

更新:

看來,你最關心的是保持了按鈕狀態的數據模型同步你的UI狀態。有幾種方法我可以想到,這將幫助你做到這一點。首先,我會注意到你的服務似乎只追蹤布爾值的幾個事情(showNew,showDelete等)。這是一項非常簡單的任務,最適合範圍變量,並且將其抽象爲工廠將是典雅抽象中的優雅抽象展示。另外請注意,無論如何,您的用戶界面可能與您的數據模型緊密耦合,因此再次進行抽象將是徒勞的。但是,這一切都是完全明顯的,這意味着你可能正在嘗試做更多的事情......所以爲了發佈一些對你有用的東西,這裏有另一個建議(也請注意,小提琴仍然有用):

- >設置你的工廠實例到範圍變量:

而不是var buttonState = EntityButtonStateService.getState();

$scope.buttonState = EntityButtonStateService.getState();

如果您還不熟悉,角的範圍服務是什麼提供了自動的2路結合 - - 我先前的評論。因此,這可能會起作用,從而允許您的用戶界面與showNewshowDelete等的值保持同步。但是,有時更新$scope會很麻煩(即,如果您的更新在摘要循環中發生較晚)。在遇到麻煩的第一個跡象時,我會將我的更新包裝在$timeout中,這會將更新推送到下一個摘要中,並且通常會執行這個技巧。

祝你好運。


OLD:

嘗試返回一個對象實例:

app.service('EntityButtonStateService', function(){ 

    var state = function(){ 
     this.showDelete = false, 
     this.showNew = false 
    }; 

    this.getStateService = function(){ 
     return new state(); 
    }; 

}); 

然後你應該可以直接在返回的服務實例的值進行操作。

OR

如果你要跟蹤的狀態裏面的服務,然後添加getter和setter個人價值。例如,通用的方法是這樣的:

app.service('EntityButtonStateService', function(){ 

    var state = { 
     showDelete: false, 
     showNew: false 
    }; 

    this.get = function(item){ 
     return state[item]; 
    }; 

    this.set = function(item, value){ 
     state[item] = value; 
    }; 
}); 

然後,你可以使用此代碼的其他地方:

// To set: 
buttonState.set('showDelete', true); 

// To get: 
buttonState.get('showDelete'); // returns true 
+0

這不會給我一個新的實例,雖然每次我要求獲得當前狀態..有效地失去了我以前設置的所有值? – Lock

+0

在你的代碼示例中,你表明你想直接對返回的值進行操作,例如'buttonState.showDelete = ...'所以服務的返回值**是你的狀態對象。你也可以通過直接調用'buttonState.showDelete'來獲得狀態。如果你想做其他事情,那麼你的目標不明確 –