初始分配后无法获取我的服务值以进行更新

时间:2015-12-27 23:41:46

标签: angularjs

我正在使用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;

});

我可能做错了什么?

1 个答案:

答案 0 :(得分:1)

更新:

您最关心的问题是保持按钮状态的数据模型与您的UI状态同步。我能想到的几种方法可以帮助你做到这一点。首先,我会注意到你的服务似乎只跟踪几件事的布尔值(showNew,showDelete等)。这是一项非常简单的任务,最适合作用于变量范围的变量,并且为了优雅的抽象,将其抽象为工厂将是优雅抽象的展示。另请注意,无论如何,您的UI可能与您的数据模型紧密耦合,因此再次抽象将是徒劳的。但所有这一切都是显而易见的,这意味着你可能正在尝试做更多的事情......所以为了发布对你有用的东西,这里有另一个建议(另请注意,小提琴仍然有用):

- >将工厂实例设置为范围变量:

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

$scope.buttonState = EntityButtonStateService.getState();

如果您还不熟悉,Angular的范围服务是提供自动双向绑定的 - 因此我之前的评论。因此,这可能会有效,允许您的用户界面与showNewshowDelete等的值保持同步。但是,有时更新$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