Получите один вызов Wordpress JetPack вместо двух в Ember js без Ember Data

Я новичок в Ember и создал тест без Ember Data для WordPress JetPack json API: http://broerse.net/ember/wp3/#/posts (в результате один вызов JetPack)

Если вы получаете доступ к сообщению через URL-адрес, например http://broerse.net/ember/wp3/#/posts/3787 Я не знаю, как вернуть сообщение с идентификатором из объектов, созданных с помощью findAll. В итоге я снова получил конкретную публикацию по «id» из JetPack. Есть ли способ переписать «найти» в приведенном ниже коде, чтобы не было необходимости в двух вызовах JetPack?

App = Ember.Application.create();

App.Router.map(function() {
  this.resource('posts', function() {
    this.resource('post', { path: ':post_id' });
  });
});

App.Post = Ember.Object.extend();

App.Post.reopenClass({
  findAll: function() {
    return Ember.$.ajax({ url: 'http://public-api.wordpress.com/rest/v1/sites/58826716/posts/?number=10', dataType: "jsonp", type: 'GET' }).then(function(data) {
      return data.posts.map(function(post) {
        post['id'] = post['ID'];
        delete post['ID']; 
        return App.Post.create(post);
      });
    });
  },

  find: function(id) {
    return Ember.$.ajax({ url: 'http://public-api.wordpress.com/rest/v1/sites/58826716/posts/' + id + '/', dataType: "jsonp", type: 'GET' }).then(function(post) {
      post['id'] = post['ID'];
      delete post['ID']; 
      return App.Post.create(post);
    });
  }

});

App.PostsRoute = Ember.Route.extend({
  model: function() {
    return App.Post.findAll();
  }
});

App.PostRoute = Ember.Route.extend({
  model: function(params) {
    return App.Post.find(params.post_id);
  }
});

person Martin Broerse    schedule 26.01.2014    source источник


Ответы (1)


PostRoute можно изменить для поиска поста в модели, уже загруженной PostsRoute. Если найдено, вернет его, в противном случае попытается загрузить его через вызов ajax.

App.PostRoute = Ember.Route.extend({
  model: function(params) {
    var post = this.modelFor("posts").findBy("id",parseInt(params.post_id)); 
    if(Em.isEmpty(post)){
      return App.Post.find(params.post_id);    
    }else{
      return post;
    }

  }
});
person melc    schedule 26.01.2014
comment
Спасибо! Это именно то, что я искал. Рабочая демонстрация - person Martin Broerse; 27.01.2014
comment
Действительно ли необходим parseInt? Почему? - person Martin Broerse; 28.01.2014
comment
@Martin Broerse Я использовал его, потому что параметр не был целым числом для правильной работы findBy id. Если вы пробовали без него, и он работает, тогда все в порядке. - person melc; 28.01.2014
comment
он не работает без parseInt, но для меня это неясно из документации Ember. - person Martin Broerse; 30.01.2014