2016-01-19 6 views
-1

У меня есть «поле» маршрута/контроллера, как показано ниже;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 конкретных вопроса;

  1. я ожидал «активировать» крюк для стрельбы на начальном этапе, но выяснилось, что это не так. Сначала он запускает крюк «gridParas» , т. Е. Перед «активировать» крюк. Это из-за «gridParas» , указанных в шаблоне?

  2. Когда я делаю this.doPost() для/myService1, он должен быть запросом «sync», иначе поток выполнения изменяется, и я получаю сообщение об ошибке. На самом деле, я хочу код внутри фильтра filterCols(), то есть this.set ('gridVals.layout', this.get ('layouts') [this.get ('type')]) до выполняется только после ответа был получен от /myService1. Однако на данный момент я должен использовать запрос «sync», чтобы сделать , что в противном случае с «async» выполнение переходит к filterCols() и , так как у меня пока нет ответа, это вызывает ошибку.

Просто добавить, я использую Ember v 2.0

ответ

2
  1. activate() по маршруту запускается после в beforeModel, model и afterModel крючки ... потому что эти 3 крючка считаются «фаза проверки» (которая определяет, разрешит ли маршрут вообще). Чтобы быть ясным, этот крючок маршрута не имеет никакого отношения к использованию gridParas в вашем шаблоне ... он имеет все, что связано с звонком get('gridParas') в вашей модели.
  2. Непонятно, где doPost() подключен к остальной части вашего кода ... однако, поскольку он возвращает объект promise, который вы можете наклеить на then(), который позволит вам по существу дождаться ответа на обещание, а затем использовать это в остальной части вашего кода.

Простой пример:

this.doPost().then((theResponse) => { 
    this.doSomethingWith(theResponse); 
}); 

Если вы можете упростить ваш вопрос более ясным и кратким, я может быть в состоянии предоставить больше информации

+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

0

Обычно на этом уровне, вы должны объяснить, что вы хочу архивировать, а не просто спрашивать, как это работает, потому что я думаю, что вы много сражаетесь с рамкой!

Но я беру это из вашего комментария.

Во-первых, вам не нужен ваш метод doPost! jQuerys $.ajax возвращает thenable, который может быть разрешен к Promise с Ember.RSVP.resolve!

Next: Если вы хотите получить данные, прежде чем делать что-либо, вы должны сделать это в крючке model!

Я не уверен, что вы хотите получить /service1, а затем с ответом вы создадите запрос на /service2 или вы можете получить обе службы самостоятельно, а затем показать свои данные (свою сетку?) С данными обе услуги. Так вот оба пути:


Если вы можете получить как услуги самостоятельно сделать это в маршрутах model крюк:

return Ember.RSVP.hash({ 
    service1: Ember.RSVP.resolve($.ajax(/*your request to /service1 with all data and params, may use query-params!*/).then(data => { 
    return data; // extract the data you need, may transform the response, etc. 
    }, 
    service2: Ember.RSVP.resolve($.ajax(/*your request to /service2 with all data and params, may use query-params!*/).then(data => { 
    return data; // extract the data you need, may transform the response, etc. 
    }, 
}); 

Если вам нужен ответ /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 
    }); 
}); 

Если это вам не поможет (и я действительно думаю, что это должно исправить ваши проблемы), пожалуйста, опишите свою проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^