在等待$onInit回调完成时,我应该为Angular绑定的属性返回什么?



我有一个这样的angular服务:

appModule.factory('dataService', DataService);
DataService.$inject = ['dataContext'];
function DataService(dataContext) {
    var service = Object.create(DataService.prototype);
    service._dataContext = dataContext;
    service._details = {};
    service.$onInit();
    return service;
}
DataService.prototype = {
    $onInit: function () {
        this._dataContext.combinedQuery(DataQuery)
            .then(function (data) {
                this._details = data[0];
            }.bind(this));
    },
    Details: function () {
        return this._details;
    }    
};

使用它的控制器如下:

DetailsController.$inject = ["dataService"];
function DetailsController(dataService) {
    this._dataService = dataService;
}
DetailsController.prototype = {
    $onInit: function () {
        this.details = this._dataService.Details;
    },
}

View正在绑定{{$DetailsController.details}}

运行DataService.$onInit返回时,在this._details = data[0]被调用之前,DataService.Details函数的返回值将被绑定到DetailsController.details

我应该从DataService.Details返回什么,以便一旦设置了this._details,数据显示在绑定视图上?

我认为它应该像下面这样,但我不想再次调用$onInit:

return this.$onInit()
        .then(function () {
            return this._details;
        }.bind(this));

我会尝试使用Promises

appModule.factory('dataService', DataService);
DataService.$inject = ['dataContext'];
function DataService(dataContext) {
    DataService.prototype().then( function (err, prototype){
      if(err){
       return err;
      }
       //Else
       var service = Object.create(prototype);
       service._dataContext = dataContext;
       service._details = {};
       service.$onInit();
       if(service){
         return service;
       }
    });
}
DataService.prototype = {
  return new Promise( function( resolve, reject){
    $onInit: function () {
        this._dataContext.combinedQuery(DataQuery)
            .then(function (data) {
                this._details = data[0];
            }.bind(this));
    }
    if( this.details ){
      Details: function () {
        return resolve( this._details );
      }   
    } else {
        return reject({err: 'Unable to set details'})
    }
  });  
};

我不能保证如果上面的代码100%工作,因为我没有建立一个Plunker或类似的,但是,它看起来真的像一个asynchronous问题。如果这不起作用,您应该将$on.init()也包装成Promise

无论如何,我从来没有见过像你这样写services/factories,所以我有点困惑。

最新更新