Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们可以访问工厂AngularJS中的控制器方法吗?_Angularjs - Fatal编程技术网

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

我们可以访问工厂AngularJS中的控制器方法吗?,angularjs,Angularjs,我在一个控制器中有这个方法,我想在工厂中访问它,我已经通过函数在工厂中注入了$scope变量,我从范围中获取所有的值,除了这个方法,它是在该控制器中定义的,任何帮助都可以 .factory('viewPdfDocument',['$sce','searchService', 'scrollTop', 'pdfPluginDetector', '$timeout',function($sce, searchService, scrollTop, pdfPluginDetector, $timeou

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

.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);

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

如果需要共享帐户,请使用BthHanks公共服务来快速回复Riyaj,为什么要这样做。问题是,我想在多控制器上使用一种方法,所以我在工厂中定义了该方法。但该方法包含对同一控制器的其他方法调用。朋友,您做错了什么。您应该将这些事情分开。从控制器中的工厂返回值,并在此基础上调用我们的metod