Angular,使用服务还是工厂?

时间:2015-03-02 20:24:35

标签: angularjs

我正在尝试在模块之间建立一个中间点以获取自定义URL,以便用户可以保存(复制URL)状态并与其他用户共享(或返回到它)。我正在尝试构建一个简单的工作副本,然后我的目标是使其尽可能多态。

我现在有一个基本的工作副本,使用url对象存储一些变量(现在在url对象中),然后在加载的控制器中读取这些变量以更改为所需的状态。例如,我的第一个控制器的顶部是

 $scope.test = $location.search().test;

所以无论test =在url中,它都会设置为$ scope.test(这些控制我的状态)。我现在已将所有内容分解为单个模块,因此我初始化模块的方法是设置这样的函数(在堆栈的其他位置找到)

function persistMod($scope, $window) {

$scope.$watch(function (){
  return $window.test;
}, function(v) {
if(v == undefined ){}else{
  if($scope.test !== v) {
     $scope.test = v;
  }
}
});

$scope.$watch('test', function(v) {
  if($window.test !== v) {
     $window.test = v;
  }
});

$scope.$watch(function (){
   return $window.test2;
}, function(v) {
if(v == undefined ){}else{
  if($scope.test2 !== v) {
     $scope.test2 = v;
  }
}
});

 $scope.$watch('test2', function(v) {
  if($window.test2 !== v) {
     $window.test2 = v;
  }
});
}

在控制器中我只是打电话

persistMod($scope, $window);

这样做的目的是让他们分别跟踪彼此,以便在更新网址时 - 每个模块可以跟踪其他当前状态,这样就不会产生混淆。所以我可以打电话给

$location.search({mod1: $scope.test, mod2: $scope.test2});

当状态发生变化时,它会保持不变。

所以这里的问题是 - 我想把它变成一个服务,我可以注入两个模块中间,以便为我跟踪这个并相应地更改URL。所以我想知道这更多的是工厂或服务的工作。

我想:

- 跟踪有多少状态发生变化(假设最小值为2,最大值为15)并相应更改网址

- 能够为每个模块单独发送新的url并让它更新url字符串,其中包含一些帖子,如myService.urlChange(“newurlvariable”);

因此,工厂/服务必须跟踪有多少模块正在使用它并相应地进行更改。这对我来说还是新的,所以我可以使用一些指导,我已经做了一堆挖掘并且现在感觉被卡住了。任何见解都非常受欢迎。谢谢你的阅读!

2 个答案:

答案 0 :(得分:1)

那样的东西?

angular.module(...).factory('persistMod', function ($window) {
    return function persistMod($scope, name) {
        //watch $window[name]
        //watch $scope[name]
    }
});

[...]

angular.module(...).controller('MyCtrl', function($scope, persistMod) {
    persistMod($scope, 'test');
    persistMod($scope, 'test2');
});

另外,为什么不简化这个:

if($window.test !== v) {
    $window.test = v;
}

......用这个:

$window.test = v;

分配前无需测试。

答案 1 :(得分:1)

所以你肯定想要一家工厂。但是你需要重写大部分内容来做你想做的事。

将工厂视为单身人士非常重要,几乎就像全球职能和变量一样。你可以有这样的工厂......

app.factory('PersistMod', [
  function() {
    var service = {};

    service.url;
    service.addItem = function(item) {
      service.url = service.url + item;
    }

    service.getUrl = function() {
      return service.url;
    }

    return service;
  }])

我不会写完整件事,但希望这会让你知道如何设置它。

设置完毕后,您可以将此工厂注入控制器,然后调用函数或获取变量。例如

PersistMod.addItem('something');
var currentUrlString = PersistMod.getUrl;
console.log(currentUrlString) // 'something'

希望这有帮助。