Javascript AngularJS使用控制器中的一个函数从要在ng repeat中使用的服务返回数据
我正在尝试使用控制器中的函数返回数据,以便我可以在整个应用程序中重复使用该函数来调用数据,并偶尔刷新数据 我的代码看起来是正确的,但实际上,每次加载都会使浏览器崩溃 我可以通过使用E指令,然后将元素放在partial中来让它工作,但这并不能实现我所需要的 最后,我想这样做:Javascript AngularJS使用控制器中的一个函数从要在ng repeat中使用的服务返回数据,javascript,angularjs,javascript-framework,Javascript,Angularjs,Javascript Framework,我正在尝试使用控制器中的函数返回数据,以便我可以在整个应用程序中重复使用该函数来调用数据,并偶尔刷新数据 我的代码看起来是正确的,但实际上,每次加载都会使浏览器崩溃 我可以通过使用E指令,然后将元素放在partial中来让它工作,但这并不能实现我所需要的 最后,我想这样做: <div ng-repeat="user in getListUsers()">{{ user.somedata }}</div> 编辑: 使用下面的一些想法,我能够以不同的方式获得我想要的功能。基
<div ng-repeat="user in getListUsers()">{{ user.somedata }}</div>
编辑:
使用下面的一些想法,我能够以不同的方式获得我想要的功能。基本上,我希望数据按需加载,而不是预先加载,因为我试图将所有用户逻辑分组到该控制器中,我不希望为每个用户加载完整的数据。在解决一些作用域继承问题之前,我暂时使用$rootScope,因为使用$scope.users会在模板中得到一个空值。我可以看到AJAX调用又回来了,但不确定它要去哪里,但这是另一个问题
elite.controller('UserController', function($scope, $rootScope, User){
$scope.getListUsers = function(){
User.listUsers().then(function(response){
$rootScope.users = response.users;
});
};
});
在导航元素中,我有:
<div ng-controller="UserController">
<a ng-href="/#user/list" ng-click="getListUsers()">user list</a>
</div>
这是关于$digest、$watch和ng repeat的。你可以通过谷歌搜索或查看JSPLANE提供的链接找到很多答案 简而言之,每次调用getListUsers()函数时,它都会返回一个用户列表。但是,每个返回的列表都是一个新集合(数组)。对于angular,这意味着它必须更新页面上列表的显示。每次更新之后,Angular都会通过再次调用getListUsers()函数检查几次列表是否稳定。每次angular发现列表不同时,它都会不断更新列表并不断调用getListUser函数 要解决此问题,可以创建一个保存用户列表的变量:
$scope.userList = [];
以及更新列表的功能
$scope.reloadListUsers = function(){
User.listUsers().then(function(response){
$scope.userList = response.users;
});
}
然后在ng repeat指令中
<div ng-repeat="user in userList">{{ user.somedata }}</div>
{{user.somedata}
在要重新加载列表的位置,只需调用reloadListUsers函数
<button ng-click="reloadListUsers()" > reload </button>
重新加载
背后的原因是,现在绑定中使用了变量userList,而不是函数调用表达式,并且一旦加载列表,它就会变得稳定。存在一些问题。您正在从一个匿名函数返回一个值,该函数在解析从$http.get调用返回的承诺时被调用。该函数的返回值将不是从getListUsers返回的值 此外,您正在控制器回调中引用response.users。这仍然是原始响应对象。您可能打算引用response.data.users 试试这个:
elite.controller('UserController', function($scope, User){
$scope.users = [];
$scope.getListUsers = function(){
User.listUsers().then(function(response){
$scope.users = response.data.users;
});
}
}))
然后,将其绑定到视图中:
<div ng-repeat="user in users">{{ user.somedata }}</div>
{{user.somedata}
如果用户未定义或为空,ng repeat指令将不会吐出任何元素。查看我之前看到的,但即使我不使用ng repeat,问题也会发生。例如,如果我只是将函数放在括号中,比如{{getListUsers()}},浏览器仍然会崩溃,而不是显示对象。它与response.users一起工作,原始数据在服务中得到处理。我想我理解你的意思,Angular没有像我在这里想象的那样工作。我觉得我见过其他代码,其中函数被用作对象,但我可能错了。我已经用你的一些建议编辑了我的问题,现在我有一个范围问题,但我很可能会找到答案。
elite.factory('User', function($http){
var User = {
getUser: function(id){
return $http.get('/user/' + id + '/settings');
},
listUsers: function(){
return $http.get('/user/');
}
}
return User;
});
<div ng-repeat="user in users">{{ user.somedata }}</div>