如何在控制器中使用此角度工厂

How to use this angular factory in controller?

本文关键字:工厂 控制器      更新时间:2023-09-26

工厂:

factory('cordovaReady', function () {
    return function (fn) {
        var queue = [];
        var impl = function () {
            queue.push(Array.prototype.slice.call(arguments));
        };
        document.addEventListener('deviceready', function () {
            queue.forEach(function (args) {
                fn.apply(this, args);
            });
            impl = fn;
        }, false);
        return function () {
            return impl.apply(this, arguments);
        };
    };
})

我在另一家工厂用过这个工厂:

return {
    getCurrentPosition: cordovaReady(function (onSuccess, onError, options) {
        //
    }
}

当deviceReady事件被激发时,cordovaReady工厂将执行传递的回调。我的问题是如何在控制器中使用它?

我只试过

.controller( 'HomeCtrl', function HomeController($scope, cordovaReady) {   
  cordovaReady(function(){
        //do stuff
  });   
}); 

但这并没有奏效。没有控制台错误。有什么想法吗?

我通过包装像这样的因子来解决它

.factory('aUseCase', function ($q, $rootScope, cordovaReady) {
    return {
        doSomething: cordovaReady(function () {
            //do stuff
        })
    };
})

@artworkad:的更好版本

.factory('aUseCase', ['$q', '$rootScope', 'cordovaReady', function ($q, $rootScope, cordovaReady) {
    return {
        doSomething: cordovaReady(function () {
            //do stuff
        })
    };
}])

不要忘记显式注入依赖项,否则缩小此代码段时会出现问题。

您确定您的依赖项正在注入控制器中吗?

var MyController = function($scope, cordovaReady) {
  ...
}
MyController.$inject = ['$scope', 'cordovaReady'];

在控制器中,您需要声明一个函数才能使用cordovaReady

myApp.controller("salaryCalculatorCtr", ['$scope', 'cordovaReady'
, function ($scope, cordovaReady) {
    var initApp= cordovaReady(function () {
       //do something
    });
    initApp();
}]);