Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS使用控制器中的一个函数从要在ng repeat中使用的服务返回数据_Javascript_Angularjs_Javascript Framework - Fatal编程技术网

Javascript AngularJS使用控制器中的一个函数从要在ng repeat中使用的服务返回数据

Javascript AngularJS使用控制器中的一个函数从要在ng repeat中使用的服务返回数据,javascript,angularjs,javascript-framework,Javascript,Angularjs,Javascript Framework,我正在尝试使用控制器中的函数返回数据,以便我可以在整个应用程序中重复使用该函数来调用数据,并偶尔刷新数据 我的代码看起来是正确的,但实际上,每次加载都会使浏览器崩溃 我可以通过使用E指令,然后将元素放在partial中来让它工作,但这并不能实现我所需要的 最后,我想这样做: <div ng-repeat="user in getListUsers()">{{ user.somedata }}</div> 编辑: 使用下面的一些想法,我能够以不同的方式获得我想要的功能。基

我正在尝试使用控制器中的函数返回数据,以便我可以在整个应用程序中重复使用该函数来调用数据,并偶尔刷新数据

我的代码看起来是正确的,但实际上,每次加载都会使浏览器崩溃

我可以通过使用E指令,然后将元素放在partial中来让它工作,但这并不能实现我所需要的

最后,我想这样做:

<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>