我有一个这样的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
,所以我有点困惑。