以下のような「ボックス」ルート/コントローラーがあります。
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 つあります。
「アクティブ化」フックが最初に起動されることを期待していましたが、そうではないことがわかりました。最初に「gridParas」フック、つまり「activate」フックを実行します。テンプレートに「gridParas」を指定したせいでしょうか?
/myService1 に対して this.doPost() を実行するときは、「同期」リクエストでなければなりません。そうしないと、実行の流れが変わり、エラーが発生します。実際には、 filterCols() コントローラー内のコード、つまり this.set('gridVals.layout', this.get('layouts')[this.get('type')]) を、応答を受信した後にのみ実行したい/myService1 から。ただし、現時点では、「同期」リクエストを使用してそれを行う必要があります。そうしないと、「非同期」を使用すると、実行が filterCols() に移動し、まだ応答がないため、エラーがスローされます。
追加するために、私はEmber v 2.0を使用しています