我正在使用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 :(得分:1)
更新:
您最关心的问题是保持按钮状态的数据模型与您的UI状态同步。我能想到的几种方法可以帮助你做到这一点。首先,我会注意到你的服务似乎只跟踪几件事的布尔值(showNew,showDelete等)。这是一项非常简单的任务,最适合作用于变量范围的变量,并且为了优雅的抽象,将其抽象为工厂将是优雅抽象的展示。另请注意,无论如何,您的UI可能与您的数据模型紧密耦合,因此再次抽象将是徒劳的。但所有这一切都是显而易见的,这意味着你可能正在尝试做更多的事情......所以为了发布对你有用的东西,这里有另一个建议(另请注意,小提琴仍然有用):
- >将工厂实例设置为范围变量:
而不是var buttonState = EntityButtonStateService.getState();
做$scope.buttonState = EntityButtonStateService.getState();
如果您还不熟悉,Angular的范围服务是提供自动双向绑定的 - 因此我之前的评论。因此,这可能会有效,允许您的用户界面与showNew
和showDelete
等的值保持同步。但是,有时更新$scope
会很麻烦(例如,如果您的更新发生了在消化周期的后期)。在出现问题的第一个迹象时,我会将更新包装在$timeout
中,这会将更新推送到下一个摘要,这通常可以解决问题。
OLD:
尝试返回对象实例:
app.service('EntityButtonStateService', function(){
var state = function(){
this.showDelete = false,
this.showNew = false
};
this.getStateService = function(){
return new state();
};
});
然后您应该能够直接操作返回的服务实例的值。
或强>
如果要跟踪服务中的状态,请将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