在回调中调用同一对象内的函数

时间:2014-11-21 18:26:07

标签: angularjs object callback

我知道我的标题有点令人困惑,但我想问题就是这样。

我正在尝试调用与调用者在同一个对象上但在回调中的函数。

serv.factory("repo", function(rest, $location){

return {
    get: function(repoName, cb){
        this.i[repoName].length > 0 ? cb(this.i[repoName]) : rest[repoName].query(cb)   
    },
    i:{
        events: rest.events.query(>>>>>>CALL readyCheck()<<<<<),
        audiences: rest.audiences.query(>>>>>>CALL readyCheck()<<<<<),
        categories: rest.categories.query(>>>>>>CALL readyCheck()<<<<<),
        outcomes: rest.outcomes.query(>>>>>>CALL readyCheck()<<<<<),
        regions: rest.regions.query(>>>>>>CALL readyCheck()<<<<<),
        types: rest.types.query(>>>>>>CALL readyCheck()<<<<<) 
    },
    url:'',
    readyCheck: function(){
        var ready = true
        angular.forEach(this.i, function(value, key){
            if( value.length < 2 ) {
                ready = false
            }
        })
        if(!ready){
            console.log('not ready')
            this.url =  $location.path() !== '/loading' ? $location.path() : this.url
            $location.path('/loading')
        } else {
            console.log('ready')
            $location.path(this.url)
        }
    }
}

})

当我使用this.readyCheck时,似乎已经失去了它对父对象的引用(get,i,url,readyCheck)

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你试图使用的'this'是一个不同的函数,因此'this'是不同的。 为了能够从就绪检查功能中访问URL属性,将服务存储到变量中以便以后能够访问它。像这样:

var service;
service = {
    get: function(repoName, cb){
        this.i[repoName].length > 0 ? cb(this.i[repoName]) : rest[repoName].query(cb)   
    },
    i:{
        events: rest.events.query(>>>>>>CALL readyCheck()<<<<<),
        audiences: rest.audiences.query(>>>>>>CALL readyCheck()<<<<<),
        categories: rest.categories.query(>>>>>>CALL readyCheck()<<<<<),
        outcomes: rest.outcomes.query(>>>>>>CALL readyCheck()<<<<<),
        regions: rest.regions.query(>>>>>>CALL readyCheck()<<<<<),
        types: rest.types.query(>>>>>>CALL readyCheck()<<<<<) 
    },
    url:'',
    readyCheck: function(){
        var ready = true
        angular.forEach(this.i, function(value, key){
            if( value.length < 2 ) {
                ready = false
            }
        })
        if(!ready){
            console.log('not ready')
            service.url =  $location.path() !== '/loading' ? $location.path() : service.url
            $location.path('/loading')
        } else {
            console.log('ready')
            $location.path(this.url)
        }
    }
};