У меня есть «поле» маршрута/контроллера, как показано ниже;Ember Понять поток выполнения между маршрутом/контроллером
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» , т. Е. Перед «активировать» крюк. Это из-за «gridParas» , указанных в шаблоне?
Когда я делаю this.doPost() для/myService1, он должен быть запросом «sync», иначе поток выполнения изменяется, и я получаю сообщение об ошибке. На самом деле, я хочу код внутри фильтра filterCols(), то есть this.set ('gridVals.layout', this.get ('layouts') [this.get ('type')]) до выполняется только после ответа был получен от /myService1. Однако на данный момент я должен использовать запрос «sync», чтобы сделать , что в противном случае с «async» выполнение переходит к filterCols() и , так как у меня пока нет ответа, это вызывает ошибку.
Просто добавить, я использую Ember v 2.0
Thx для ответа ... Для части doPost() существует 2 вызова AJAX. Первый из них -/myService1 (завернутый в мой метод реализации пользовательских обещаний) и 2nd one/myService2 (который фактически создается моим пользовательским компонентом, когда я говорю returnObj.url = '/ myService2') Я хочу, чтобы они работали в следующей последовательности; 1. Вызовите/myService1 2. Затем после ответа от 1 вызовите/myService2 3. Затем управление должно перейти к контроллеру, и сетка должна заполнить (т.е. следующий код для выполнения ... this.set ('gridVals. layout ', this.get (' layouts ') [this.get (' type ')]);) – testndtv