对Angular范围的JavaScript访问返回" undefined" - 异步问题?

时间:2016-02-06 01:32:32

标签: javascript angularjs node.js asynchronous cytoscape

问题:我试图从服务器获取一些数据来填充cytoscape图。当我从javascript访问范围时,未定义。

尽管有这个/类似问题的帖子很多。我很难找到一个关于如何解决从javascript文件访问范围的问题的解释,一旦数据准备就绪(如果这就是问题)。

我读过http.get方法是异步的吗?所以他们在执行后不会阻止任何事情。我想这是因为数据尚未返回而导致访问范围时导致未定义错误的原因?我已经找到了一些相关信息,但无法弄清楚如何解决这个问题。我可以使用角度花括号以HTML的常规方式访问数据并且它可以工作。当我从控制器返回一些数据时,它也可以工作。

如果有人能指出我正确的方向,我真的很感激。

这是我试图运行的javascript文件,它抓取范围并将节点添加到cytoscape图。

<script type="text/javascript">
    window.onload = function() {
        nodes = angular.element(document.querySelector('[ng-controller="DataController"]')).scope().nodes;
        alert(nodes);
        cy.add(nodes);
    }
</script>

2。它从控制器调用工厂方法。

dataFactory.getNodes().then(function(data)
    {
        $scope.nodes = data;
    });

3。来自工厂的http.get

_service.getNodes = function()
    {
        return $http.get(urlBase + "/nodes");
    };

4。 node.js返回一些节点&#39;添加到cytoscape图

router.get('/api/data/nodes', function(req, res) {
        console.log('sending some data');
        var data = [
            ...
            ];
        res.status(200).json(data);
    });

我已经看过&#34;承诺&#34;提到所以我想我接下来会朝那个方向前进......

由于

1 个答案:

答案 0 :(得分:1)

您正在尝试在加载DOM(window.onload)时提醒节点的值,并且尚未返回来自服务的数据。 您的控制器已经使用了promise,并且在解析promise时数据被绑定到范围。

.then(function(data){
    ...
});

如果您特别想从外部js脚本访问数据,只需从控制器调用该函数即可:

脚本

<script type="text/javascript">
function alertNodes() {
    nodes = angular.element(document.querySelector('[ng-controller="DataController"]')).scope().nodes;
    alert(nodes);
    cy.add(nodes);
}
</script>

控制器

dataFactory.getNodes().then(function(data){
        //$scope.nodes = data;
        alertNodes()
    });