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

时间:2016-02-12 07:48:16

标签: angularjs

我在一个控制器中有这个方法,我想在工厂内访问它我已经在工厂中通过函数注入$scope变量,我从范围获取所有值,除了在该控制器中定义的此方法帮助赞赏。

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

2 个答案:

答案 0 :(得分:1)

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

如果它是单次回调,比如指示某些活动的完成,那么最干净的方法是使服务方法返回一个承诺并在它想要通知控制器时解决它。然后回到控制器中,你就完成了承诺

控制器:

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

这为控制器提供了最大的灵活性,它可以根据需要随时调用.then()

还有承诺提供持续通知的余地,比如在下载时显示进度条。

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

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

答案 1 :(得分: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();
}

}])

它被称为观察者模式。 如果要通过服务通知控制器中的多个功能,可以使用它