Javascript Ember了解路由/控制器之间的执行流程
我有一个盒子路径/控制器,如下所示Javascript Ember了解路由/控制器之间的执行流程,javascript,ajax,ember.js,ember-cli,rsvp-promise,Javascript,Ajax,Ember.js,Ember Cli,Rsvp Promise,我有一个盒子路径/控制器,如下所示 export default Ember.Controller.extend({ initialized: false, type: 'P', status: 'done', layouts: null, toggleFltr: null, gridVals: Ember.computed.alias('model.gridParas'), gridParas: Ember.computed('mySer
export default Ember.Controller.extend({
initialized: false,
type: 'P',
status: 'done',
layouts: null,
toggleFltr: null,
gridVals: Ember.computed.alias('model.gridParas'),
gridParas: Ember.computed('myServerPars', function() {
this.set('gridVals.serverParas', this.get('myServerPars'));
this.filterCols();
if (!this.get('initialized')) {
this.toggleProperty('initialized');
} else {
Ember.run.scheduleOnce('afterRender', this, this.refreshBox);
}
return this.get('gridVals');
}),
filterCols: function()
{
this.set('gridVals.layout', this.get('layouts')[this.get('type')]);
},
myServerPars: function() {
// Code to set serverParas
return serverParas;
}.property('type', 'status', 'toggleFltr'),
refreshBox: function(){
// Code to trigger refresh grid
}
});
我的路线看起来像
export default Ember.Route.extend({
selectedRows: '',
selectedCount: 0,
rawResponse: {},
model: function() {
var compObj = {};
compObj.gridParas = this.get('gridParas');
return compObj;
},
activate: function() {
var self = this;
self.layouts = {};
var someData = {attr1:"I"};
var promise = this.doPost(someData, '/myService1', false); // Sync request (Is there some way I can make this work using "async")
promise.then(function(response) {
// Code to use response & set self.layouts
self.controllerFor(self.routeName).set('layouts', self.layouts);
});
},
gridParas: function() {
var self = this;
var returnObj = {};
returnObj.url = '/myService2';
returnObj.beforeLoadComplete = function(records) {
// Code to use response & set records
return records;
};
return returnObj;
}.property(),
actions: {
}
});
我的模板看起来像
{{my-grid params=this.gridParas elementId='myGrid'}}
我的doPost方法如下所示
doPost: function(postData, requestUrl, isAsync){
requestUrl = this.getURL(requestUrl);
isAsync = (isAsync == undefined) ? true : isAsync;
var promise = new Ember.RSVP.Promise(function(resolve, reject) {
return $.ajax({
// settings
}).success(resolve).error(reject);
});
return promise;
}
鉴于上述设置,我想了解执行的流程/顺序,即不同挂钩的流程/顺序。
我试着调试,它不断地从一个类跳到另一个类。
还有2个具体问题
我原本希望启动激活钩子,但发现情况并非如此。它首先执行gridhook
i、 e.在激活挂钩之前。是不是因为我
在模板中指定
当我为/myService1执行这个.doPost时,它必须是一个同步请求,否则执行流会改变,我会得到一个错误。
事实上,我想在filterCols控制器中输入代码,即。
this.set'gridVals.layout',this.get'layouts'[this.get'type']设置为
仅在收到来自的响应后执行
/我的服务1。但是,到目前为止,我必须使用同步请求来完成
否则,使用async时,执行将移动到filterCols和
因为我还没有响应,所以它抛出了一个错误
只是补充一下,我使用的是Ember v 2.0
路线上的激活在beforeModel、model和afterModel挂钩后触发。。。因为这3个钩子被认为是验证阶段,它决定了路由是否会被解析。要明确的是,这个路由钩子与在模板中使用gridParas无关。。。它与在模型钩子中调用get'gridParas'有关。
我不清楚doPost在哪里连接到您的其余代码。。。但是,因为它返回一个promise对象,所以您可以加上一个then,这将允许您基本上等待promise响应,然后在代码的其余部分使用它。
简单的例子:
this.doPost().then((theResponse) => {
this.doSomethingWith(theResponse);
});
如果你能简化你的问题,使之更加清晰和简洁,我也许能提供更多的信息。一般来说,在这个级别上,你应该解释你想要归档的内容,而不仅仅是问它是如何工作的,因为我认为你在与框架作斗争 但我从你的评论中删除了这一点 首先,您不需要doPost方法!jQuerys$.ajax返回一个thenable,可以使用Ember.RSVP.resolve将其解析为承诺 下一步:如果您想在实际渲染任何内容之前获取数据,您应该在模型挂钩中执行此操作 我不确定是否要获取/service1,然后通过响应生成对/service2的请求,或者是否可以独立获取这两个服务,然后将数据显示在网格中?使用这两种服务的数据。所以这里有两种方法: 如果可以独立获取这两个服务,请在路由模型挂钩中执行此操作:
return Ember.RSVP.resolve($.ajax(/*/service1*/)).then(service1 => {
return Ember.RSVP.resolve($.ajax(/*/service2*/)).then(service2 => {
return {
service1,
service2
}; // this object will then be available as `model` on your controller
});
});
如果需要/service1的响应来获取/service2,只需在模型挂钩中执行以下操作:
return Ember.RSVP.resolve($.ajax(/*/service1*/)).then(service1 => {
return Ember.RSVP.resolve($.ajax(/*/service2*/)).then(service2 => {
return {
service1,
service2
}; // this object will then be available as `model` on your controller
});
});
如果这对您没有帮助,我真的认为这应该可以解决您的问题,请描述您的问题。Thx对于响应…对于doPost部分…基本上有两个AJAX调用。第一个调用是包装在我的自定义承诺实现方法中的/myService1,第二个调用是由我的自定义承诺实现方法生成的/myService2组件当我说returnObj.url='/myService2'时,我希望它们按以下顺序工作;1.致电/myservice12。然后在收到1的响应后,调用/myService2 3。然后控件应转到控制器,网格应填充,即以下要执行的代码…this.set'gridVals.layout',this.get'layouts'[this.get'type'];