Javascript 在等待$onInit回调完成时,如何返回角度绑定属性
我有一个角度服务,比如:Javascript 在等待$onInit回调完成时,如何返回角度绑定属性,javascript,angularjs,Javascript,Angularjs,我有一个角度服务,比如: appModule.factory('dataService', DataService); DataService.$inject = ['dataContext']; function DataService(dataContext) { var service = Object.create(DataService.prototype); service._dataContext = dataContext; service._deta
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;
},
}
并且该视图是绑定的{{$detailscoontroller.details}
运行DataService时,$onInit
将返回,DataService.Details
函数返回值将绑定到DetailsController.Details
,然后再调用。\u Details=data[0]
我应该从DataService.Details
返回什么,这样一旦设置了this.\u Details
,数据就会显示在绑定视图上
我想应该是下面这样,但我不想再调用$onInit
:
return this.$onInit()
.then(function () {
return this._details;
}.bind(this));
我会尝试使用
承诺
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
或类似的东西,但是,它看起来确实是一个异步的问题。如果这不起作用,您也应该将.init()上的$
包装到承诺中
无论如何,我从来没有见过像你这样写服务/工厂,所以我有点困惑
希望它能有所帮助。我会尝试使用承诺
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
或类似的东西,但是,它看起来确实是一个异步的问题。如果这不起作用,您也应该将.init()上的$
包装到承诺中
无论如何,我从来没有见过像你这样写服务/工厂,所以我有点困惑
希望对您有所帮助。如果您尝试在上记录数据
,那么(函数(数据))
会得到什么?基本上,您希望在后一步之后执行Details:function()
?我确实在中得到了正确的值。然后(function(data)
,但是Details:function()
在它之前被调用。因此,是的,我想在之后执行它。然后
。我发现一个解决方案不确定它是否是最好的。我将承诺分配给这样一个变量this.init=this.\u dataContext.combinedQuery(DataQuery)
。在详细信息:function()
中返回this.init.then(func…
如果尝试在上记录数据
,那么(函数(数据))
会得到什么?基本上,您希望在后一步后执行详细信息:函数()
?我会在中得到正确的值。然后(函数(数据)
,但是详细信息:函数()
在它之前被调用。因此,是的,我想在之后执行它。然后
。我发现一个解决方案不确定它是否是最好的。我将承诺分配给这样一个变量this.init=this.\u dataContext.combinedQuery(DataQuery)
。在详细信息:function()
中返回this.init.then(func…
谢谢,我想我在上面的评论中基本上是这样做的,我将承诺分配给一个变量this.init
,尽管这看起来更明确。嗯,这取决于,我总是这样显式的,这样我就可以轻松地将不同的异步任务链接在一起。如果你设法让它几乎可以工作,请告诉我我也可以帮你修改我的答案。谢谢,我想我在上面的评论中基本上是这样做的,我把承诺分配给一个变量this.init
,虽然这看起来更明确。嗯,好吧,这取决于它,我总是这样明确它,这样我就可以轻松地将不同的异步任务链接在一起。如果你设法让它成为almos请告诉我,这样我可以帮助你,也可以修改我的答案。