2016-09-21 4 views
0

Я пишу приложение Electron (node.js) с интерфейсом AngularJS. Из-за того, что node.js работает на уровне ОС и работает на угловом уровне на уровне клиента, они разговаривают друг с другом с помощью IPC (или в этом случае ipc реализуется https://github.com/develephant/electangular).

В этом случае, у меня есть служба, которая используется для огня сообщение IPC к приложению узла:

app.service('msgService', ['ipc', '$rootScope', '$q', function(ipc, $rootScope, $q){ 
    this.sendMsg = function(type, value) { 
     var message = { 
      type: type, 
      value: value 
     }; 

     ipc.send(message); 
    }; 
}]); 

Эта услуга вводится в, и призвал с помощью контроллера, главный контроллер:

app.controller('mainController', ['$scope', '$rootScope', 'electron', 'msgService', 'hey', function($scope, $rootScope, electron, msgService, hey){ 

    msgService.sendMsg('db_find', {}); 

    // I can see the variable inside this console.log 
    console.log($rootScope); 

    // I get undefined here 
    console.log($rootScope.msg); 

}]); 

После того, как приложение узел генерируется запрос, он посылает сообщение обратно через МПК, который затем подобран кусок кода в .run секции углового приложения:

app.run(['$window', '$rootScope', function($window, $rootScope) { 

    $rootScope.$on('electron-msg', (event, msg) => { 
     $rootScope.msg = msg; 
    }); 

}]); 

Вышеприведенное просто устанавливает свойство msg в переменной $ rootScope внутри run, и я ожидаю, что вы сможете получить доступ из моего контроллера. Вы заметите по комментариям на консольных страницах, что я могу получить доступ к $ rootScope, и значение возвращается, однако, когда я пытаюсь и самостоятельно регистрировать $ rootScope.msg, я получаю «неопределенный». Это также верно для попытки установить переменную из переменной $ rootScope.msg - я получаю undefined.

Я пробовал все с этим, и я полностью в конце моего троса!

Любая помощь очень ценится :)

EDIT:

Ниже выход console.log ($ rootScope); в соответствии с запросом:

Scope {$id: 1, $$childTail: ChildScope, $$childHead: ChildScope, $$prevSibling: null, $$nextSibling: null…} 
$$ChildScope 
    : 
     ChildScope() 
$$applyAsyncQueue 
    : 
     Array[0] 
$$asyncQueue 
    : 
     Array[0] 
$$childHead 
    : 
     Scope 
$$childTail 
    : 
     Scope 
$$destroyed 
    : 
     false 
$$isolateBindings 
    : 
     null 
$$listenerCount 
    : 
     Object 
$$listeners 
    : 
     Object 
$$nextSibling 
    : 
     null 
$$phase 
    : 
     null 
$$postDigestQueue 
    : 
     Array[0] 
$$prevSibling 
    : 
     null 
$$watchers 
    : 
     Array[2] 
$$watchersCount 
    : 
     99 
$id 
    : 
     1 
$parent 
    : 
     null 
$root 
    : 
     Scope 
msg 
    : 
     Array[4] 
notificationCount 
    : 
     0 
notifications 
    : 
     Array[0] 
online 
    : 
     true 
__proto__ 
    : 
     Object 

Извинения за плохое форматирование! Но вы можете видеть msg, сидящий в $ rootScope!

+0

Пожалуйста, покажите вывод 'console.log ($ rootScope)' ... – MarcoS

+0

почему вы не можете использовать app.run часть вашего кода в ваш контроллер? –

+1

Есть ли вероятность, что 'ipc.send' будет асинхронным? – devqon

ответ

1

Похоже, что электронная библиотека вызывает эти сообщения асинхронными, что приводит к тому, что $rootScope.msg еще не заполняется при ведении журнала.

Вы, конечно, можете просто слушать события в контроллере:

msgService.sendMsg('db_find', {}); 

$rootScope.$on("electron-msg", (event, msg) => { 
    // message done 
    console.log(msg); 
}); 

Хотя это, конечно, также поймать любые другие сообщения, которые посылают через Ipc службу.

+0

Как бы я мог перейти к этой переменной из index.html, например, в ng-repeat? Я пробовал это и фактически не получил ничего от «сайтов в allSites» после установки $ scope.allSites. –

+0

Вы можете получить доступ к свойствам '$ rootScope' в любом представлении, просто используя' $ root.msg' в своем html – devqon

+0

Это потрясающе, я этого не знал. Тем не менее, я все еще немного уверен, как получить доступ к $ root.msg в ng-repeat - возможно ли это? Я пробовал ng-repeat = "вещь в $ root.msg", но не повезло –

1

Как обсуждалось в комментариях, @Adam Thomason испытывает проблемы при вызове функции async после того, как он пытался использовать console.log. Чтобы гарантировать, что он использует данные, которые он хочет после выполнения функции, для него работал следующий код.

angular.element(document).ready(function() { 
    console.log('Hello World'); 
}); 

Надеется, что это помогает кто-то еще, а =)

+0

Я использовал эту функцию для установки переменной $ scope.allSites, которую я тогда хотел получить в html-файле, однако в ng-repeat я не получаю никаких данных. –

+0

$ rootScope переменные доступны прямо в вашем html, например: ng-repeat = "current_msg в $ root.msg" –

+0

Любая идея, как получить доступ к $ root.msg в ng-repeat? Я так близок к тому, что это работает! –