我们可以访问工厂AngularJS中的控制器方法吗?

问题描述:

我在一个控制器里面有这个方法,我想在工厂里面访问它我已经通过函数在工厂里注入了$scope变量,除了这个控制器中定义的方法外,我得到了所有的值。我们可以访问工厂AngularJS中的控制器方法吗?

.factory('viewPdfDocument',['$sce','searchService', 'scrollTop', 'pdfPluginDetector', '$timeout',function($sce, searchService, scrollTop, pdfPluginDetector, $timeout) { 
    return { 
     pdfView: function ($scope, docId, pdftest, accessForbiddenMessage, genericErrorMessage) { 
      clearCheckBoxes(); 
     } 
    }; 
}]); 
+0

为什么你想这样做,如果有什么需要共享使用共同服务bth –

+0

感谢您的快速回复Riyaj。事情是,有一种方法我想在多个控制器上使用它,所以我在工厂内定义了这个方法。但该方法在同一控制器上包含一些其他方法调用。 –

+0

朋友,你做错了什么。你应该把事情分开。从控制器的工厂返回价值,并在此基础上调用我们的方法 –

您可以在您的服务和控制器中创建通知功能,您将添加该功能。

控制器

//In your controller: 

var clearCheckBoxes = function(){ 
//your function here 
} 

viewPdfDocument.registerObserverCallback(clearCheckBoxes); 

的服务:

//In your service: 
.factory('viewPdfDocument',['$sce','searchService', 'scrollTop', 'pdfPluginDetector', '$timeout',function($sce, searchService, scrollTop, pdfPluginDetector, $timeout) { 
var observerCallbacks = []; 
var notifyObservers = function() { 
      angular.forEach(observerCallbacks, function (callback) { 
       callback(); 
      }); 
     }; 
    return { 
      observerCallbacks: function (callback) { 
       observerCallbacks.push(callback); 
      }, 
      pdfView: function() { 
    notifyObservers(); 
} 

}]) 

这就是所谓的观察者模式。 如果你想通知服务控制器中的几个功能,你可以使用它

该服务不需要知道控制器的细节。您应该能够在其他情况下重新使用您的服务,或许这种控制器的回调不同。

如果它是一次性回调,比如说表示某个活动已完成,那么最简洁的方法是使服务方法返回一个承诺,并在想要通知控制器时解析它。然后回到控制器,你采取行动的承诺完成

控制器:

viewPdfDocument.pdfView(...).then(clearCheckBoxes); 

这为控制器最大的灵活性,它调用.then()经常因为它具有不同的功能希望。

也有承诺给予正在进行的通知的范围,比如将进度条显示为下载内容。

viewPdfDocument.pdfView(...).then(null, null, updateProgress); 

需要注意的是,如果你想在角使用进度通知,你必须使用旧$q.defer()机制来创建并通知承诺,否则使用ES6兼容机制。