0

问题:我正在尝试从服务器获取一些数据来填充 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 返回一些“节点”以添加到 cytoscape 图中

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

我已经看到提到的“承诺”,所以我想我接下来会朝着那个方向前进......

谢谢

4

1 回答 1

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()
    });
于 2016-02-06T02:41:09.497 回答