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