如何在控制器中使用这个角度工厂?

时间:2013-08-05 10:26:22

标签: javascript angularjs

厂:

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) {
        //
    }
}

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

我尝试了

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

但它没有用。没有控制台错误。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

更好的@artworkad版本:

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

不要忘记明确注入依赖项,否则在缩小此代码段时会遇到问题。

答案 2 :(得分:0)

你确定你的依赖注入你的控制器吗?

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

答案 3 :(得分:0)

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

myApp.controller("salaryCalculatorCtr", ['$scope', 'cordovaReady'
, function ($scope, cordovaReady) {

    var initApp= cordovaReady(function () {

       //do something
    });
    initApp();
}]);