Как вы используете контроллеры ember-rest для работы с вложенными ресурсами Rails3? - PullRequest
5 голосов
/ 01 марта 2012

Я новичок в клиентской части Javascript MVC, первое приложение ember.js.

Я следую приведенным здесь инструкциям, чтобы использовать ember-rest при создании вложенных моделей пост-комментариев.

http://www.cerebris.com/blog/2012/01/26/beginning-ember-js-on-rails-part-2/

Я начал писать вложенные ресурсы следующим образом:

  resources :conversations do
    resources :comments
  end

Теперь проблема в том, что мне пришлось написать контроллер ember-rest:

App.commentsController = Ember.ResourceController.create ({ resourceType: App.Comment resourceURL: '/versations /: id / comments' });

Я не думаю, что смогу использовать: id в середине; как я мог обойти это? Решает ли это ember-data? Кажется, интеграция spine.js будет немного легче справиться с этим. Заранее спасибо!

1 Ответ

6 голосов
/ 01 марта 2012

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

Я должен начать с того, что написал ember-rest очень тонкимслой поверх jQuery.ajax.Он не очень продвинутый, и даже нет встроенного средства для ассоциаций.Тем не менее, я рассматриваю возможность добавления одного из них, поскольку эта библиотека пользуется большим спросом.Как вы увидите из приведенного ниже кода, эту концепцию можно обработать, но ее лучше абстрагировать в lib.

Ассоциации можно обработать, создав экземпляр контроллера ресурса в каждом родительском ресурсе.Каждый конкретный контроллер ресурсов должен управлять конкретным массивом ресурсов, но не обязательно всеми ресурсами определенного типа.

В вашем случае вы можете расширить ResourceController для управления комментариями к беседам:

  App.ConversationComments = Ember.ResourceController.extend({ 
    resourceType: App.Comment,

    // override _resourceUrl() to base the url on the conversation
    _resourceUrl: function() {
      return this.get("conversation")._resourceUrl() + "/comments";
    }
  });

Затем вы можете настроить экземпляр ConversationComments для каждой беседы:

  App.Conversation = Ember.Resource.extend({
    resourceUrl:        '/conversations',
    resourceName:       'conversation',
    resourceProperties: ['prop1', 'prop2']

    // init comments
    init: function() {
      this.set("comments", App.ConversationComments.create({ conversation: this }));
    }
  });

И последнее, но не менее важное: вам нужно получить комментарии для каждого разговора:

  conversation.get("comments").findAll();

Если у вас есть все комментарии в json, вы можете использовать loadAll ().Где и когда вы вызываете loadAll () или findAll (), зависит от потребностей вашего приложения.Очевидно, что вы захотите уменьшить количество вызовов ajax для лучшей производительности.

Ember-data - гораздо более амбициозный проект, чем ember-rest, и уже имеет поддержку ассоциаций, а также расширенные функции, такие как транзакции,С учетом сказанного, он находится в стадии активной разработки с меняющимся API.Если вы терпеливы и готовы копаться в коде, я настоятельно рекомендую попробовать его.Когда пыль немного оседает, я также планирую написать об этом в блоге.

...