gpt4 book ai didi

javascript - AngularJS - 数组在 http get 调用后未更新 - 不使用 $scope 的解决方案?

转载 作者:行者123 更新时间:2023-12-02 16:13:49 25 4
gpt4 key购买 nike

假设我们有以下资源(使用 ngResource 模块),它返回 JSON 结果数组:

app.factory('myApi', function($resource) {
return $resource('/myApi/:param')
// returns an array of json objects
});

以及以下主 Controller :

app.controller('mainController', function(myApi) {
var results = []
var _init = function() {
myApi.get({param: 1234}, function(data) {
results = data.results
});
}

_init();

return {
results: results
}
});

我想对结果运行 ng-repeat。

<body ng-controller="mainController as main">
<p ng-repeat="r in main.results">{{r.myResult}}</p>
</body>

我已确认资源返回了正确的结果。然而,使用上面的模板,什么也没有出现。

我试图在不使用 $scope 和使用“Controller as”语法的情况下完成此任务。我还试图通过在 Controller 对象中不使用大量的“this.___”来保持代码的整洁和可维护性(因此在 Controller 定义的末尾返回一个对象)。

解决这个问题最干净的方法是什么?我见过很多使用 $scope 的解决方案,但我不想再继续使用该对象。

最佳答案

您的示例存在一些问题:

  1. 首先,当您在 init 回调中设置 results 时, Controller 的 results 字段不会引用该新数组。由于您没有使用 Angular 的 $scope,因此您需要手动维护 Controller 的当前状态。
  2. 其次,由于您的回调是异步触发的,因此它不在当前的摘要循环中。因此,您需要在更新数据时手动强制摘要。

下面的示例修复了 Controller 的两个问题:

app.controller('mainController', function($scope, myApi) {
// Create our non-angular state/scope to return upfront so
// we can modify its "results" when we get our data back.
var _ctrlState = {
results: null
};

var _init = function() {
myApi.get({param: 1234}, function(data) {
// Update the results field on our controller's state
// object and force a scope digest.
_ctrlState.results = data.results;
$scope.$digest();
});
}
_init();

return _ctrlState;
});

这是一个工作 fiddle (注意,它有一个假的 myApi ,它返回数据以适合您的示例模板):http://jsfiddle.net/os1p0w64/

关于javascript - AngularJS - 数组在 http get 调用后未更新 - 不使用 $scope 的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29885619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com