Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 服务或工厂,以及如何使用$http_Javascript_Angularjs - Fatal编程技术网

Javascript 服务或工厂,以及如何使用$http

Javascript 服务或工厂,以及如何使用$http,javascript,angularjs,Javascript,Angularjs,将$http请求放入服务和工厂的公认方法是什么?到目前为止,我发现的唯一一种方法感觉控制器中的代码太多了。我觉得服务和/或工厂应该完成所有繁重的工作,数据应该从那里返回,但正如下面的代码所示,我正在控制器内部执行一个成功调用 我觉得这不是正确的做事方式,但这是我迄今为止找到的唯一工作方式 在我的服务对象中 this.monsterList = $http.get('data/monsters.json'); 在我的控制器里面 monsterService.monsterList.success

将$http请求放入服务和工厂的公认方法是什么?到目前为止,我发现的唯一一种方法感觉控制器中的代码太多了。我觉得服务和/或工厂应该完成所有繁重的工作,数据应该从那里返回,但正如下面的代码所示,我正在控制器内部执行一个成功调用

我觉得这不是正确的做事方式,但这是我迄今为止找到的唯一工作方式

在我的服务对象中

this.monsterList = $http.get('data/monsters.json');
在我的控制器里面

monsterService.monsterList.success(function(data) { fight.monsterList = data });
有没有一种方法可以在服务或工厂中获得完全成功的调用,这样我就可以在控制器中简单地调用它

monsterService.monsterList


您完全可以构建一个名为getMonsterList的函数,然后在ng repeat中利用它。例如,它可能看起来像这样:

... ng-repeat="item in monsterService.getMonsterList()"
comment.controller 'CommentController', ($scope, Comment $stateParams) ->
  Comment.query {id: activityId}, (data) ->
    $scope.comments = data
然后方法本身:

function getMonsterList() {
    if ($scope.items === undefined) {
        $scope.items = [];
    }

    // here you write the code to asynchronously get the items
    // the success callback would then update the items array

    return $scope.items;
}

有很多方法可以做到这一点,我们可以争论哪些方法更好,但对于服务,我通常会做一些类似的事情:

return {
    monsterList: [],
    fetchMonsters: function () {
        return $http.get("data/monsters.json").success(function (data) {
            this.monsters = data.monsters;
        }.bind(this));
    }
}
然后在控制器中,您可以执行以下操作

monsterService.fetchMonsters();
// data bind monsterService.monsterList

由于返回$http,如果必须,还可以在控制器中链接.success或.error回调。

是。您需要使用对象定义服务,然后将其注入控制器

monsterService.monsterList.success(function(data) { fight.monsterList = data });
例如,我正在使用Coffeescript,如果您需要服务,我可以为您提供JS代码:

pitagoras.factory 'Comment', ($resource) ->
  class Occurrence
    constructor: ->
      @service = $resource '/comments', {}, {
        'all': {method: 'GET'},
        'create': {method: 'POST'}
      }
    all: () ->
      @service.all()
    create: (data) ->
      @service.create(data)
  new Occurrence()
然后,在我的控制器上,我只需注入服务并按如下方式调用它:

... ng-repeat="item in monsterService.getMonsterList()"
comment.controller 'CommentController', ($scope, Comment $stateParams) ->
  Comment.query {id: activityId}, (data) ->
    $scope.comments = data

是的,我有很多方法做同样的事情,而你的方法对我来说是新的。很好的代码,我喜欢。如果你使用$resource,你甚至不需要成功处理程序。我尝试了这个方法,但我只得到了承诺对象,而不是数据。我的设置略有不同,使用服务而不是返回对象,因此this.getMonsterList=function{etc}然后运行monsterService.getMonsterList,如果可能的话,我正试图摆脱在控制器中链接成功的困境。@根据您所做的,您不必在控制器中使用承诺或直接操作数据,因此不必返回它。相反,您可以这样做。monsters=monsterService.monsterList。然后在视图中,您可以使用controllerAs.monsters,当$http由于数据绑定而自动完成时,它会更新。