Javascript 在AngularJS中,为什么我无法将资源承诺回调中的数组分配给控制器中的作用域?
考虑到下面所示的由两个不同路径生成的相同资源对象,由于某些原因,这些对象的行为不一致——在一种情况下,我可以成功地检索数组['values-response']['distinct-value'],而在另一种情况下,我在尝试时得到的是“undefined” 在服务中使用Javascript 在AngularJS中,为什么我无法将资源承诺回调中的数组分配给控制器中的作用域?,javascript,arrays,angularjs,angularjs-ng-repeat,Javascript,Arrays,Angularjs,Angularjs Ng Repeat,考虑到下面所示的由两个不同路径生成的相同资源对象,由于某些原因,这些对象的行为不一致——在一种情况下,我可以成功地检索数组['values-response']['distinct-value'],而在另一种情况下,我在尝试时得到的是“undefined” 在服务中使用$q.all()返回的承诺上的then()方法后,向控制台写入以下内容: Resource $promise: Object $resolved: true values-response: Object > distin
$q.all()
返回的承诺上的then()
方法后,向控制台写入以下内容:
Resource
$promise: Object
$resolved: true
values-response: Object
> distinct-value: Array[64]
metrics: Object
name: "term"
type: "xs:string"
为什么我不能将不同值数组分配给要在ng repeat
中使用的作用域?在将代码更改为使用承诺之前,我能够在$resource
get()
方法的回调中这样做:
$scope.topics = data['values-response']['distinct-value'];
然后我可以在模板的ng repeat
中使用data ng repeat=“topic in topics”
但是,由于切换到承诺,如果我尝试这样做:
$scope.topics = data.topics['values-response']['distinct-value'];
然后控制台返回“undefined”,尽管根据上面的输出,它似乎已被解析
相反,我被要求做:
$scope.topics = data.topics;
然后访问ng repeat
中的数组,如下所示,我不确定该数组是否已优化:
<button data-ng-repeat="topic in topics['values-response']['distinct-value'] | filter:textFilter | orderBy:browseOrder:browseDirection as resultsTopics" class="btn btn-default" type="button">
在从工厂返回$q.all()
之前,以下操作成功:
Browse.get({
facet: 'term'
}, function(data) {
$scope.topics = data['values-response']['distinct-value'];
});
<button data-ng-repeat="topic in topics | filter:textFilter | orderBy:browseOrder:browseDirection as resultsTopics" class="btn btn-default" type="button">
Browse.get({
方面:“术语”
},函数(数据){
$scope.topics=data['values-response']['distinct-value'];
});
提前感谢您的帮助。在
.get/.post
和的成功回调参数之间存在差异。在中,然后
函数(结果){}结果。数据
与中的结果
相似
试一试
也不确定它的打字错误或您在中遗漏了。获取您使用的
$scope.topics = data['values-response']['distinct-value'];
在中。然后
$scope.topics = data.topics['values-response']['distinct-value'];
检查您在响应中添加的主题
属性不要在中使用$scope.$apply
,然后
。。。将创建摘要进行中错误在第二种情况下,我使用$q.all()组合了3个承诺——我想要一个承诺,只有在所有3个承诺都解决后才能解决(但我计划使用angular promise tracker,所以我可能不希望这样,但视图取决于所有3个资源操作是否成功,所以我认为组合它们可能是有意义的),因此,我按标签指定了索引,而在另一个例子中,我连续执行了3个资源类get()调用(为了保持代码段的简单,我只显示了“topics”的一个调用)。谢谢,但我担心这会导致错误“undefined不是对象(评估'results.data.topics')”,可能是因为我没有执行$scope.apply()但是@charlietfl建议不要这样做。是的,您使用$q.all
的方法是正确的。但仍然是数据。主题还是数据本身就是主题,这不清楚吗?您是否可以更新您的内部的确切codeconsole.dir(数据)以查看数据的确切外观,然后您可以确定@vinayakj的建议是否正确。$scope.topics是否初始化为空数组?我想说的是,angular可能在未定义变量时尝试渲染,然后在定义变量时不更新。另一种方法是在您的ng repeat元素上使用ng if=“topics”,这样您就知道angular是否从未更新过变量的值。是的,对不起,我在简化代码时无意中删除了它$scope.topics在控制器中初始化为空数组,然后在BrowseService上调用then()。谢谢,我编辑了这个问题以包含它。不确定您是否可以将对象传递给$q。all()
这不是承诺,总是传递承诺参数本身,然后从中提取数据。然后正确,但$q。all
接受承诺的数组或对象,这就是我传递的内容。然后
执行解析,我可以在控制台中看到我想要的数据,但是当我尝试将其分配给$scope变量时,我得到了“未定义”的数据。问题的关键是,在这两种情况下,我在控制台中看到相同的数据,但在一种情况下,我可以将其[“distinct value”]数组分配给$scope,而在另一种情况下,我不能。这就是谜团。。。。
$scope.topics = data['values-response']['distinct-value'];
$scope.topics = data.topics['values-response']['distinct-value'];