Javascript 如何将service.js中的内部查询结果绑定到Angular.js指令中的外部变量?

Javascript 如何将service.js中的内部查询结果绑定到Angular.js指令中的外部变量?,javascript,angularjs,d3.js,Javascript,Angularjs,D3.js,使用 在directions.js中 var names = []; Animals.query(function(data){ // Animals.query() from service.js console.log(data.Names); // output > [Object, Object..., Object] names = data.Names; // attempt to bind to outer variable }); console.log(nam

使用 在directions.js中

var names = [];
Animals.query(function(data){ // Animals.query() from service.js
  console.log(data.Names); // output > [Object, Object..., Object]  
  names = data.Names; // attempt to bind to outer variable
});
console.log(names); // output > []
我可以看到那里的数据,但我需要它的功能之外。我如何在函数之外获得它?console.log(名称);发生在console.log(data.Names)之前;
我知道这与闭包和回调有关,我尝试了很多方法,但我似乎无法让它们在我的案例中发挥作用。我最终得到了一堆不断扩展的函数,它们被包装在函数中的回调中,仍然没有绑定到外部变量。我不想“污染全局名称空间”,但我需要内部函数外部的数据。最终目的是获取可用于d3.js处理的数据。一定有更简单的方法。有人能帮我处理这个特殊的案例吗?

希望我没有误解你:你已经创建了(我认为)动物作为服务的功能。为什么不把它注入指令作用域的控制器中呢

var names = [];
Animals.query(function(data){ // Animals.query() from service.js
  console.log(data.Names); // output > [Object, Object..., Object]  
  names = data.Names; // attempt to bind to outer variable
});
console.log(names); // output > []
例如:

var names = [];
Animals.query(function(data){ // Animals.query() from service.js
  console.log(data.Names); // output > [Object, Object..., Object]  
  names = data.Names; // attempt to bind to outer variable
});
console.log(names); // output > []
function Controller($scope, Animals){
  $scope.names = [];
  $scope.updateD3viz = function(){
    // do your d3 stuff here
    $scope.names = Animals.query(); // or whatever
  }
}
$scope
可从指令的
链接(scope、elem、attrs)
方法访问

var names = [];
Animals.query(function(data){ // Animals.query() from service.js
  console.log(data.Names); // output > [Object, Object..., Object]  
  names = data.Names; // attempt to bind to outer variable
});
console.log(names); // output > []

我不得不做一些类似的事情(angular和d3),最后我将d3图形作为控制器的范围属性,以确保它包含在angular的生命周期中。

如果您需要与多个组件共享相同的数据,把它放在一个服务中。啊,通过重新阅读你的问题本身,你应该能够将服务注入指令中以获取数据(或者设置一个手表来监视服务并更新指令)。我认为更“正确”的方法是将控制器设置范围变量传递到指令中,但我可能是错误的。是的,上面和注释都是这样。我误解了指令应该在何处以及如何加载数据——我现在明白了,正如Paulo所说,数据应该来自指令之外的服务,并通过控制器传递给指令,正如shaunhusain所说,并且使用了Joe下面描述的方式。另外,我相信现在路由提供者使得指令在服务完成并触发控制器之前不触发成为可能。我希望当我得到一个合适的例子时,能更新这个。谢谢,那可能会有用的我可以在另一个区域绑定到$scope.xxx,但由于某些原因,无法将其绑定到函数之外的其他单独的对象。现在看看你的方法——我想我对解决这个问题有了一种狭隘的看法,你的回答可能有助于打乱我的思路。一旦我有机会再做一次,我会核对你的答案:)是的,谢谢-对或错,我确实放弃了在函数范围外建模数据并在范围内建模的尝试。更新:尽管它有效,但我上面的方法不是“正确”的方法。正如上面所描述的,我现在所做的是将外部查询放入服务中,路由提供者等待该服务,当数据准备就绪时,将其传递给控制器,然后该指令可以传递给其中的d3.js处理。我像鹦鹉一样说了一大堆话,但不知道我在说什么:)
var names = [];
Animals.query(function(data){ // Animals.query() from service.js
  console.log(data.Names); // output > [Object, Object..., Object]  
  names = data.Names; // attempt to bind to outer variable
});
console.log(names); // output > []