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请告诉我,这样我可以帮助你,也可以修改我的答案。