ember вызовы ajax с промисами доступа приводят к шаблонам и контроллеру

Я звоню на сервер, чтобы получить некоторые данные через запрос ajax, и я использую обещание. Хотя мой шаблон автоматически обновляется, как только данные возвращаются, мне не повезло получить доступ к данным в контроллере, так как я точно не знаю, когда они там.

Чтобы решить, я могу сделать дополнительный вызов ajax в контроллере, чтобы получить те же данные, но это выглядит некрасиво. Есть ли более приятный способ узнать, когда обращаться к данным в контроллере? В качестве обходного пути я попытался вызвать функцию, которой нужны данные о didInsertElement, но это не помогло.

App.ActiveDataSet = Ember.Object.extend({
  progress: 0
});

App.ActiveDataSet.reopenClass({
  findAll: function(project_id) {
    var result = [];
    $.ajax({
      url: '/active_data_sets.json',
      type: 'GET',
      data: {'project_id': project_id}
    }).then(function(response) {
        response.active_data_sets.forEach(function(newset) {
          result.addObject(App.ActiveDataSet.create(newset));
        });
    });

    return result;
  }
});

App.MapviewShowRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this.controllerFor('activedatasetIndex').set('content', App.ActiveDataSet.findAll(model.id));
  }
});

App.MapviewShowController = Ember.ObjectController.extend({
  needs: ['activedatasetIndex'],

  content: null,
  dataSets: [],

  createDataSets: function() {

    // create the datasets
    for (var counter = 0; counter < this.get('controllers.activedatasetIndex.content').length; counter++) {
      alert(dataSets[counter].ds.name);
    }
  }

});

App.MapviewShowView = Ember.View.extend({
  map: null,

  didInsertElement: function() {
    var map = null;

    var myOptions = {
      zoom: 8,
      center: new google.maps.LatLng(52.368892, 4.875183),
      mapTypeControl: true,
      mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
      },
      navigationControl: true,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(this.$('#map_canvas').get(0), myOptions);


    this.set('map', map); //save for future updations

    var h = $(window).height(),
        offsetTop = 60; // Calculate the top offset

    $('#map_canvas').css('height', (h - offsetTop));

    // get the datasets
    this.controller.createDataSets();
  }
});

person Rudi    schedule 06.04.2013    source источник


Ответы (1)


Вы пытались продолжить цепочку обещаний:

App.ActiveDataSet.reopenClass({
  findAll: function(project_id) {
    return $.ajax({
      url: '/active_data_sets.json',
      type: 'GET',
      data: {'project_id': project_id}
    }).then(function(response) {
        var result = [];
        response.active_data_sets.forEach(function(newset) {
          result.addObject(App.ActiveDataSet.create(newset));
        });
        return result;
    });
  }
});

App.MapviewShowRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    App.ActiveDataSet.findAll(model.id).then(function(content) {
      this.controllerFor('activedatasetIndex').set('content', content);
    });
  }
});
person Joaquim Rendeiro    schedule 07.04.2013