Javascript 角度工厂,如何彻底改变结果

Javascript 角度工厂,如何彻底改变结果,javascript,angularjs,singleton,factory,Javascript,Angularjs,Singleton,Factory,我目前在Angular上工作,遇到了工厂和用户登录/注销的问题 下面是一个显示用例的示例: angular应用程序支持用户登录和注销,只要用户登录,就需要将用户的消息加载到MessageList(这是一个工厂)中。但首先,我设置了一个事件系统,在用户从应用程序登录或注销时触发加载/重置用户消息。以下是代码中的工厂: angular.module("Foo").factory("MessageList", MessageList); MessageList.$inject = ["User"];

我目前在Angular上工作,遇到了工厂和用户登录/注销的问题

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

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(...);
    }

}

角度工厂是单例的,所以只执行一次。我已经注意到可以更新对象的某些属性(例如
\u messages.push
将根据
MessageList
以角度分量正确返回包含新对象的消息列表)。但是替换整个对象似乎不起作用(每次触发
onLogin
onLogout
时,我需要完全重写
消息对象)。

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

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;

}

现在,用户详细信息将位于Factorys return对象的
数据
属性中。每次新用户登录时,您可以单独覆盖
数据
属性。

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

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;

}

现在,用户详细信息将位于Factorys return对象的
数据
属性中。每次新用户登录时,您都可以单独覆盖
数据
属性。

您可能需要更改
\u messages=$http(…)
到类似于
$http(…)。然后(函数(结果){u messages=result})哦,对不起,我写了一些东西来展示主要思想并传递那些样板代码,但是你在这里说明了一点!您可能想要更改
\u messages=$http(…)
到类似于
$http(…)。然后(函数(结果){u messages=result})哦,对不起,我写了一些东西来展示主要思想并传递那些样板代码,但是你在这里说明了一点!