【发布时间】:2018-01-30 14:43:27
【问题描述】:
我写了一个包含这个功能的控制器:
$scope.getItemName = function (id) {
sgcdata.get('item', {
_id: id
}).then(function (dataItem) {
return dataItem[0].brand_name + " " + dataItem[0].reference;
});
}
在视图中:
<li ng-repeat="itemCart in connectedUser.cart track by $index" class="list-group-item">
<span class="badge cursorpointer" ng-click="removeFromCart(itemCart)">X</span>
<a href="#">{{ getItemName(itemCart) }}</a>
</li>
当我这样做时,我得到一个无限循环 ($rootScope:infdig)。
sgcdata.get 发出 XHR 请求。
但是如果我返回一个简单的字符串,它就可以工作:
$scope.getItemName = function (id) {
return "toto";
}
我真的不明白发生了什么......
感谢您的帮助。
编辑
我做了一个过滤器而不是之前的函数:
JS:
sgc.filter('getItemName', [
'sgcdata',
function (sgcdata) {
return function (id) {
sgcdata.get('item', {
_id: id
}).then(function (dataItem) {
return dataItem[0].brand_name + " " + dataItem[0].reference;
});
}
}
]);
HTML:
<li ng-repeat="itemCart in connectedUser.cart track by $index" class="list-group-item">
<span class="badge cursorpointer" ng-click="removeFromCart(itemCart)">X</span>
<a href="#">{{ itemCart | getItemName }}</a>
</li>
我不再有任何无限循环,但我无法在 ng-repeat 中获取多个值,而过滤器返回在项目请求中。
编辑
sgcdata.get:
service.get = function (collection, filters) {
var deferred = $q.defer();
var formatRequest = function (obj) {
var str = [];
for (var p in obj) {
str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));
}
if (str.length) {
return '&' + str.join('&');
} else {
return '';
}
};
$http({
method: 'GET',
url: '/v1/get/?element=' + collection.toLowerCase() + formatRequest(filters)
}).then(function (response) {
deferred.resolve(response.data);
}, function (response) {
console.error("[ FAILED ] >> " + response);
});
return deferred.promise;
}
【问题讨论】:
-
您绑定一个值,该值将解析为触发摘要循环的内容。该循环将尝试再次解析该值并触发另一个摘要等等......只是不要绑定函数!
-
是
sgcdata一个 Promise ($q/$http)? -
@AlekseySolovey 是的。
-
@FrançoisRousselet 它不会返回一个值,而是一个 Promise instead
-
@FrançoisRousselet
$http已经返回了一个promise,不需要使用$q,这是一个anti-pattern。
标签: javascript angularjs angularjs-scope angular-http angularjs-infdig