2015-12-14 3 views
1

В моем приложении у меня есть статические вспомогательные «классы», которые выполняют для меня большую логику, в этом конкретном случае этот класс является классом обмена сообщениями и выполняет логику, требующую доступа к трем различным службам (фабрикам).Можно ли вернуть `this` с завода 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), как показано выше.

ПРИМЕЧАНИЕ: Я не могу просто внедрить сетевую реализацию $ в область $ scope и использовать ее, потому что это обрабатывается на «обратной стороне». Эта логика должна выполняться полностью независимо от области действия. Этот код должен выполняться всякий раз, когда сервер (реализация Websocket) отправляет клиенту пакетный код операции 8, независимо от области действия. Это выполнение выполняется полностью в фоновом режиме, и пользователь даже не знает, что это происходит.

Я также использую Messaging.update в других местах (от объема), где это применимо, например, в MessagingController, когда пользователь посылает сообщение, я могу вызвать Message.update с помощью впрыскиваемого $networking службы. К сожалению, инъекция здесь не вариант.

Примечание: Создание сообщений как реализация услуг приведет к созданию цикла зависимостей, поскольку у меня есть три службы в настоящее время file-cache, database, networking и реализация обмена сообщениями требует функциональности от всех трех. Для получения информации о пользователе, недоступном в локальной базе данных SQLite при получении сообщения, требуется сеть. Файловый кеш используется для кэширования образа аватара пользователя, когда создается новый поток, и, конечно, база данных необходима для хранения сообщений.

ответ

2

Как насчет этой модели

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

    var net = { 
     .... 
    }; 

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

    return net; 
}]); 
+0

Прошу прощения, потребовалось так много времени, пришлось менять вокруг большого количества кода, чтобы заставить этот шаблон работать. Благодаря! – Hobbyist

0

Ну фабричный метод не экземпляр (как к услуге соединять), объект вы возвращаете тот же объект, который вы будете ссылаться на другие части вашего приложения. Поэтому вы не можете ссылаться на это «это». Вы можете сделать что-то вроде этого (хотя я не уверен, что это хорошая практика):

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

теперь вы можете заменить «это» с «КВС».

Вместо этого я должен был обернуть ваш модуль обмена сообщениями в качестве службы. Чтобы удалить циклическую зависимость, вы создаете другую службу/фабрику, которая будет обертывать все эти службы. Я не уверен точно, как, потому что я не знаю ваш график зависимостей, но это то, что я делаю.

Смежные вопросы