Javascript 尝试访问AngularJS$scope变量时未定义
我正在编写一个带有AngularJS前端的Electron(node.js)应用程序。由于node.js在操作系统级别运行,Angular在客户机级别运行,因此这两个节点使用IPC(或者在本例中,使用IPC实现)相互通信 在本例中,我有一个服务,用于向节点应用程序发送IPC消息:Javascript 尝试访问AngularJS$scope变量时未定义,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,我正在编写一个带有AngularJS前端的Electron(node.js)应用程序。由于node.js在操作系统级别运行,Angular在客户机级别运行,因此这两个节点使用IPC(或者在本例中,使用IPC实现)相互通信 在本例中,我有一个服务,用于向节点应用程序发送IPC消息: app.service('msgService', ['ipc', '$rootScope', '$q', function(ipc, $rootScope, $q){ this.sendMsg = funct
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);
}]);
msgService.sendMsg('db_find', {});
$rootScope.$on("electron-msg", (event, msg) => {
// message done
console.log(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时,会得到“undefined”。如果试图从$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
抱歉格式错误!但是你可以在$rootScope中看到msg 似乎electron库异步触发了这些消息,这导致在您进行日志记录时,
$rootScope.msg
尚未填充
当然,您可以在控制器中收听事件:
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);
}]);
msgService.sendMsg('db_find', {});
$rootScope.$on("electron-msg", (event, msg) => {
// message done
console.log(msg);
});
当然,这也会捕获通过ipc服务发送的任何其他消息。似乎electron库异步触发这些消息,这导致在您进行日志记录时,
$rootScope.msg
尚未填充
当然,您可以在控制器中收听事件:
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);
}]);
msgService.sendMsg('db_find', {});
$rootScope.$on("electron-msg", (event, msg) => {
// message done
console.log(msg);
});
尽管这当然也会捕获通过ipc服务发送的任何其他消息。如评论中所述,@Adam Thomason在尝试console.log后遇到调用异步函数的问题。为了确保他在函数执行后使用他想要的数据,下面的代码为他工作
angular.element(document).ready(function () {
console.log('Hello World');
});
希望它对其他人也有帮助=)正如评论中所讨论的,@Adam Thomason在尝试console.log后遇到了调用异步函数的问题。为了确保他在函数执行后使用他想要的数据,下面的代码为他工作
angular.element(document).ready(function () {
console.log('Hello World');
});
希望它对其他人也有帮助=)请显示
console.log($rootScope)
…为什么不能在控制器中使用app.run部分代码?是否有可能ipc.send
是异步的?请尝试console.log(msg);在$rootScope内。$on,只是看看函数是否被调用一次或两次……是的,当然这会使它有所不同。可能是您在触发异步事件之前记录了$rootScope.msg
。您可以通过在$timeout(function(){//log},1000)中包装日志来测试它
请显示console.log($rootScope)
…为什么不能在控制器中使用app.run部分代码?是否有可能ipc.send
是异步的?请尝试console.log(msg);在$rootScope内。$on,只是看看函数是否被调用一次或两次……是的,当然这会使它有所不同。可能是您在触发异步事件之前记录了$rootScope.msg
。您可以通过在$timeout(function(){//log},1000)中包装日志来测试它代码>然后如何从index.html中访问此变量,例如在ng repeat中?我已经试过了,在设置$scope.allSites之后,实际上没有从“所有站点中的站点”中得到任何东西。你可以在任何视图中通过在你的HTML中使用$root.msg
来访问$rootScope
属性。这太棒了,我不知道。但是,我仍然有点不确定如何在ng repeat中访问$root.msg-可能吗?我尝试了ng repeat=“thing in$root.msg”,但在第一次签出$root.msg
是什么时,没有运气。是数组吗?对不起,我不喜欢发牢骚,但似乎其他用户刚刚复制了我的评论,他的回答完全没有用/与此无关。所以我很好奇为什么你接受他的答案?然后我如何从index.html中访问这个变量,例如在ng repeat中?我已经试过了,在设置$scope.allSites之后,实际上没有从“所有站点中的站点”中得到任何东西。你可以在任何视图中通过在你的HTML中使用$root.msg
来访问$rootScope
属性。这太棒了,我不知道。但是,我仍然有点不确定如何在ng repeat中访问$root.msg-可能吗?我尝试了ng repeat=“thing in$root.msg”,但在第一次签出$root.msg
是什么时,没有运气。是数组吗?对不起,我不喜欢发牢骚,但似乎其他用户刚刚复制了我的评论,他的回答完全没有用/与此无关。所以我很好奇为什么你接受他的答案?我用这个函数设置了$scope.allSites变量,然后我想在html文件中访问它,但是在ng repeat中我没有收到任何数据。$rootScope变量可以直接在html中访问,如:ng repeat=“current\u msg in$root.msg”知道如何在ng repeat中访问$root.msg吗?我差一点就能让它工作了!如果$root.msg确实是一个数组,那么它应该可以工作,检查这个fiddle我使用这个函数设置了$scope.allSites变量,然后我想在html文件中访问它,但是在ng repeat中我没有收到任何数据。$rootScope变量可以在html中直接访问,就像这样:ng repeat=“current_msg in$root.msg”知道如何在ng中访问$root.msg吗-