当由角度服务中定义的函数B调用时,函数A未定义

时间:2018-01-06 11:45:53

标签: angularjs angularjs-service

我在服务中遇到以下代码时出现问题:

angular.module('my_proj').factory('artistService',
    function($injector, $ionicListDelegate, $rootScope, $state,
         $stateParams, $timeout, $translate, SomeStore,
         appConstants, appService, coreService, moment, loginService) {
    return {
            goToMedia: function(artistId, state) {
                var self = this;

                SomeStore.findByPk(artistId, {}, function(reminder) {

                // works
                $injector.get('artistService').applyMusicFilter(reminder);

                // throws "applyMusicFilter is not a function"
                self.applyMusicFilter(reminder);
           }
    }
}

我怀疑解释器运行我的代码的顺序是个问题。使用$ injector调用相同的函数,可以正常工作,但是使用self作为对此的引用直接调用它不会。

有谁能告诉我,这里的问题是什么以及我做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:0)

让它发挥作用的一种方法是使用function declaration

app.factory('artistService', function($injector, $ionicListDelegate,
         $rootScope, $state, loginService) {
    return {
        applyMusicFilter: applyMusicFilter,
        goToMedia: function(artistId, state) {
            //Invoke hoisted function
            applyMusicFilter("whatever");
        }
    };
    //Function declaration
    function applyMusicFilter(reminder) {
        console.log(reminder)
    }
})

在JavaScript中,函数定义为hoisted。您可以在声明之前使用该功能。

答案 1 :(得分:0)

此处self引用goToMedia函数,该函数没有applyMusicFilter的定义,因为您有未定义的错误。

$injector方法有效,因为它返回工厂创建的对象,其中包含所有方法定义。