Javascript 为什么我的控制器属性是';未定义';当我将$resource query()的结果分配给它时?

Javascript 为什么我的控制器属性是';未定义';当我将$resource query()的结果分配给它时?,javascript,angularjs,javascript-framework,Javascript,Angularjs,Javascript Framework,我有一个JSON数据结构: [ { "title" :"a1", "id" :"b1", "name" :"c1" }, { "title" :"a2", "id" :"b2", "name" :"c2" } ] 我以外部JSON的形式访问is,并通过工厂方法进行解析。我希望它将其分配给控制器中的Javascript变量 function Control($scope,data) { var e=data.query(); /* ge

我有一个JSON数据结构:

 [
{
"title"  :"a1",
"id"     :"b1",
"name"   :"c1"
},
{
"title"  :"a2",
"id"     :"b2",
"name"   :"c2"
}
 ]       
我以外部JSON的形式访问is,并通过工厂方法进行解析。我希望它将其分配给控制器中的Javascript变量

 function Control($scope,data)

 {

 var e=data.query();   /* getting the external JSON data  */
 alert(e[0].title);    

}

它表示
e[0]
未定义。是否有其他方法可以将其分配给Javascript变量,然后遍历它?请帮忙

很可能,@Marty是正确的。如果使用$resource服务中的query()方法,则它是异步的。这可能会满足您的要求:

data.query( function( data ) {
  var e = data;
  alert(e[0].title);
});

好吧,$resource可能会像这样混淆。。。它会立即向您提供对返回对象的引用,但在异步AJAX调用返回之前不会更新该对象。。。所以

如果将data.query()的返回值放在$scope的属性中,因为在视图中绑定它时$scope会监视它,所以会看到它更新。但是,如果您只是试图提醒它,它将在更新之前提醒该值。。同样是因为$resource的异步特性

否则,您可以按照@MarkRajcok在其答案中显示的方式获得值

下面是一个psuedo代码示例,说明了如何使用$resource query()


这一切都是为了让返回的对象可以在其上预先实例化函数,如$save(),等等。

不确定
.query()
的作用,但假设它是一个异步调用,这意味着在执行
警报()
时数据尚未加载。query实际上会获取结果。我可以从模板中访问数据,但不能从控制器中访问。我假设“模板”(抱歉,我没有角度)在加载所有外部数据后工作。我希望它更一般化。我希望它能够在javscript控制器中访问。您能发布一个示例,说明您的
data.query()
的实际功能吗?它到底返回了什么(一个目标、承诺等)?好吧,至少今天我的答案和你的不同看起来不错,但是在那里有e=data有什么好处?@Marty,我只是在遵循给定的代码。我很可能会设置一些$scope属性来存储数据。
app.controller('FooCtrl', function($scope, $resource) {
     var Bar = $resource('/Bar/:id', {id: '@id'});

     // here, we get the result reference and stick it in the scope,
     // relying on a digest to update the value on our screen.
     $scope.data = Bar.query();

     //OR

     //here we already have a reference.
     var test = Bar.query(function() {
          //in here, test has been populated.
          $scope.data2 = test;
     });
     alert(test); //not populated here, yet.

     //OR

     Bar.query(function(x) {
          $scope.data3 = x;
     });
});