Angular工厂,如何彻底改变结果

时间:2017-03-12 07:18:53

标签: javascript angularjs singleton factory

我目前正在研究Angular并遇到工厂和用户登录/注销问题。

以下是一个显示用例的示例:

角度应用程序支持用户登录和注销,只要用户登录,就需要将用户的消息加载到MessageList(这是工厂)中。首先,我设置了一个事件系统,以便在用户登录或从应用程序注销时触发加载/重置用户消息。这是代码中的工厂:

angular.module("Foo").factory("MessageList", MessageList);

MessageList.$inject = ["User"];

function MessageList(User) {
    var _messages;

    User.onLogin(activate);       User.onLogout(function() { _messages = undefined; });

    activate();
    return _messages;

    ///

    function activate() {
        _messages = $http(...);
    }

}

Angular工厂是单身,所以只执行一次。我已经注意到可以更新对象的某些属性(例如_messages.push将使用角度组件中的新对象正确返回消息列表,具体取决于MessageList)。但是替换整个对象似乎不起作用(每次触发onLoginonLogout时,我都需要完全重写the _messages对象。)

1 个答案:

答案 0 :(得分:2)

你可以修改你的逻辑,如下所示:

angular.module("Foo").factory("MessageList", MessageList);

MessageList.$inject = ["User"];

function MessageList(User) {
    var _messages;

    User.onLogin(activate);       User.onLogout(function() { _messages = undefined; });

    function activate() {
        _messages.data = $http(...);
    }
    var _messages = {
        activate: activate
    };
    activate();
    return _messages;

}

现在,用户详细信息将位于工厂返回对象的data属性中。每次新用户登录时,您都可以单独覆盖data属性。