2014-10-03 59 views
0

我知道同样的问题在很多时候都被询问过,但我找不到符合我的要求的确切问题。因此,这里是我的问题:

我有我的一个功能:

showPNG = function() { 
     var pngPromise = $modal({ 
      template: 'index.html', 
      persist: true, 
      show: false, 
      backdrop: 'static', 
      scope: $scope, 
      modalClass: 'preview-png' 
     }); 
     $q.when(pngPromise).then(
      function(pngElement) { 
       pngElement.modal('show'); 
      } 
     ); 
}; 

我有3个控制器具有相同的功能。所以我试图用一些服务来编写它,并可以从所有的控制器中调用它来重构它。我到目前为止已经做的是:

在服务:

var service = module.exports = function ($modal, $q) { 
     return { 
      showPNG : function(scope) { 
       var pngPromise = $modal({ 
        template: 'index.html', 
        persist: true, 
        show: false, 
        backdrop: 'static', 
        scope: scope, 
        modalClass: 'preview-png' 
       }); 
       $q.when(pngPromise).then(
        function(pngElement) { 
         pngElement.modal('show'); 
        } 
       ); 
      } 
     }; 
}; 
service.$inject = ['$modal', '$q']; 

在控制器:

... 
    myService.showPNG($scope); 
... 

此代码的工作没有任何错误。但问题是,可以通过$scope作为一个参数的参数是服务导致任何副作用?这种方法有没有更好的替代方案?

谢谢。

回答

0

我会建议不要将$范围传递给服务。这使您的服务依赖于正在使用它的控制器。如果其他控制器需要使用该服务会怎么样?

相反,应该让服务回报承诺,并在控制器里做类似如下:

.controller("ctrl1", ["$scope", "service", function($scope, service){ 
    $scope.showModal = false; 
    service.showPNG() 
     .then(function(shouldShow){ 
     $scope.showModal = shouldShow; 
     $scope.$apply(); // assuming showPNG is async 
     }); 
}]); 

编辑: 下面是一个模式对话框服务中如何实现的例子:http://weblogs.asp.net/dwahlin/building-an-angularjs-modal-service

+0

你能否提供服务代码? – RAS 2014-10-06 06:09:00