AngularJS将逻辑放入服务而不是控制器,最佳实践

时间:2015-03-27 20:49:39

标签: 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://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){

}]);

我似乎无法让它发挥作用。另外我为什么需要改变它?它会提高性能,还是只使代码更清晰易读?

1 个答案:

答案 0 :(得分:2)

您的工厂提供商没有退货。要访问它,您需要实际返回同步对象。

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;
});

然后单独添加组件,直到它中断或按预期工作。处理多种新技术和概念时的一种很好的方法。