我们可以访问工厂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();
}
};
}]);
答
您可以在您的服务和控制器中创建通知功能,您将添加该功能。
控制器
//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兼容机制。
为什么你想这样做,如果有什么需要共享使用共同服务bth –
感谢您的快速回复Riyaj。事情是,有一种方法我想在多个控制器上使用它,所以我在工厂内定义了这个方法。但该方法在同一控制器上包含一些其他方法调用。 –
朋友,你做错了什么。你应该把事情分开。从控制器的工厂返回价值,并在此基础上调用我们的方法 –