AngularJS将逻辑应用于服务而非控制器,最佳实践

AngularJS将逻辑应用于服务而非控制器,最佳实践,angularjs,service,firebase,Angularjs,Service,Firebase,我有一个从firebase收集数据的控制器。我在我的网站上到处都使用它,所以它一直都被调用 app.controller("ReplicatedController", function($scope, $routeParams, $firebaseObject) { var parts = location.hostname.split('.'); var refSubdomain = parts.shift(); var ref = new Firebase("https:/

我有一个从firebase收集数据的控制器。我在我的网站上到处都使用它,所以它一直都被调用

app.controller("ReplicatedController", function($scope, $routeParams, $firebaseObject) {

  var parts = location.hostname.split('.');
  var refSubdomain = parts.shift();

  var ref = new Firebase("https://example-firebase.firebaseio.com/" + refSubdomain);
  var syncObject = $firebaseObject(ref);
  syncObject.$bindTo($scope, "coach");

  if($routeParams.my_affiliate){
    var myAffiliate = $routeParams.my_affiliate;
    window.location = "http://" + myAffiliate + ".example.com";
  };

});
这很好,但我的问题是,我应该将其转移到服务中吗?这是否会使我访问Firebase的次数减少

另外,将这样的内容转移到服务中的最佳方式是什么。我只是创建一个服务吗

app.factory('ReplicatedService', ['$http', function($scope, $routeParams, $firebaseObject){
  var parts = location.hostname.split('.');
  var refSubdomain = parts.shift();

  var ref = new Firebase("https://example-firebase.firebaseio.com/" + refSubdomain);
  var syncObject = $firebaseObject(ref);
  syncObject.$bindTo($scope, "coach");

  if($routeParams.my_affiliate){
    var myAffiliate = $routeParams.my_affiliate;
    window.location = "http://" + myAffiliate + ".example.com";
  };

});
然后从我的控制器呼叫服务

app.controller('ReplicatedController', ['$scope','ReplicatedService', function($scope,ReplicatedService){

}]);

我好像没法让它工作。还有为什么我需要改变它?它会提高性能,还是只是让代码更清晰易读?

您的工厂供应商不会返回任何内容。要访问它,您需要实际返回同步对象

app.factory('ReplicatedService', ['$http', function($scope, $routeParams, $firebaseObject){
  var parts = location.hostname.split('.');
  var refSubdomain = parts.shift();

  ...

  return syncObject;
});

app.controller('...', function(ReplicatedService) {
   $scope.data = ReplicatedService;
});
这是通过简化进行调试的典型案例。要自己解决这个问题,您可以首先将其分解为您能想到的最小工作组件:

app.factory('test', function() {
   return { foo: 'bar' };
});

app.controller('...', function($scope, test) {
   $scope.test = test;
});

然后逐个添加组件,直到其按预期方式中断或工作。在处理多种新技术和概念时,这是一种很好的方法。

是的,所有API调用/业务逻辑(IMO)都应该在一个服务中,然后重新使用。控制器链接视图和业务逻辑/模型。