是否可以从AngularJS工厂返回`this`?

时间:2015-12-14 19:41:12

标签: javascript angularjs

在我的应用程序中,我有静态助手"类"为我执行大量逻辑,在这种特定情况下,此类是消息传递类,并执行需要访问三个不同服务(工厂)的逻辑。

唯一需要引用此类的工厂是网络工厂,因为当收到某个数据包时,我需要强制消息传递从服务器更新它的数据库。

以下是我尝试做的一个例子:

angular.module('database', []).factory('$database', function() {
    // SQLite implementation

    return {
       // ...
    };
});

angular.module('networking', []).factory('$networking', ['$database', function($database) {
    // Websocket implementation
    if(packet.opcode == 8) {
        Messaging.update(this, $database);
    }

    return {
       // ...
    };
}]);

Messaging = {
    // Messaging implementation..
    update: function(networking, database) {
        if(networking === undefined) { ]
            console.log("Networking is undefined.");
            return;
        }

        if(database === undefined) {
            console.log("Database is undefined.");
            return;
        }

        // Messaging update implementation.
};

不幸的是,在尝试呼叫Networking is undefined.时会显示Messaging.update(this, $database)消息,如上所示。

注意:我不能简单地将$ networking实现注入$ scope并使用它,因为这是在"后端"处理的。该逻辑应完全独立于范围执行。只要服务器(Websocket实现)将数据包操作码8发送到客户端,无论范围如何,都应执行此代码。这种执行完全在后台完成,用户甚至不知道它发生了。

我也在适用的其他地方(来自范围)使用Messaging.update,例如在MessagingController用户发送消息时,我可以使用Message.update来调用$networking注入的file-cache, database, networking服务。不幸的是,注射剂不是一种选择。

注意:创建Messaging作为服务实现会创建一个依赖循环,因为我目前有三个服务host,而消息传递实现需要所有这三个服务的功能。当收到消息时,网络需要获取有关本地SQLite数据库中不可用的用户的信息。文件缓存用于在创建新线程时缓存用户头像图像,并且当然需要数据库来存储消息。

2 个答案:

答案 0 :(得分:2)

这种模式怎么样

angular.module('networking', []).factory('$networking', ['$database', function($database) {

    var net = {
        ....
    };

    // Websocket implementation
    if(packet.opcode == 8) {
        Messaging.update(net, $database);
    }

    return net;
}]);

答案 1 :(得分:0)

工厂方法未实例化(与服务相似),您返回的对象与您在应用程序的其他部分中引用的对象相同。所以你不能用这个'来引用它。你可以做这样的事情(虽然我不确定它是一个好习惯):

//inside your factory
var fac = { //your factory object
};
return fac;

现在你可以替换这个'与' fac'。

我要做的是将Messaging模块包装为服务。为了删除循环依赖项,您将创建另一个将包装所有这些服务的服务/工厂。我不确定具体如何,因为我不知道您的依赖图,但这就是我的工作。