尝试访问时,AngularJS $ scope变量未定义

时间:2016-09-21 12:07:14

标签: javascript angularjs node.js

我正在使用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中!

2 个答案:

答案 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');
});

希望它能帮助其他人=)