我正在使用AngularJS前端编写Electron(node.js)应用。由于node.js在OS级别运行而Angular在客户端级别运行,因此两者使用IPC(或者在这种情况下,由https://github.com/develephant/electangular实现的ipc)相互通信。
在这个例子中,我有一个服务,用于向节点应用程序发送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);
}]);
一旦节点应用程序生成了请求,它就会通过ipc发回消息,然后由Angular应用程序的.run部分中的一段代码选择:
app.run(['$window', '$rootScope', function($window, $rootScope) {
$rootScope.$on('electron-msg', (event, msg) => {
$rootScope.msg = msg;
});
}]);
上面只是在run中的$ rootScope变量上设置一个msg属性,然后我希望能够从我的控制器内部访问。您可以通过console.log行上的注释注意到我可以访问$ rootScope并返回值,但是当我尝试单独记录$ rootScope.msg时,我得到了未定义的#39;。尝试从$ rootScope.msg变量设置变量也是如此 - 我得到了未定义。
我已经尝试过这一切,而且我完全在我的系绳末端!
任何帮助非常感谢:)
修改
以下是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 :(得分:1)
似乎电子库会异步触发这些消息,导致在您进行记录时$rootScope.msg
尚未填充。
您当然可以只听取控制器中的事件:
msgService.sendMsg('db_find', {});
$rootScope.$on("electron-msg", (event, msg) => {
// message done
console.log(msg);
});
虽然这当然也会捕获通过ipc服务发送的任何其他消息。
答案 1 :(得分:1)
正如评论中所讨论的那样,@ Adam Thomason在尝试使用console.log之后遇到了异步函数问题。为了确保在执行函数后他使用他想要的数据,以下代码适用于他。
angular.element(document).ready(function () {
console.log('Hello World');
});
希望它能帮助其他人=)