Подтвердить что ты не робот

Эмбер без данных Ember

Данные Ember по-прежнему не соответствуют версии 1.0, и поэтому я решил использовать Ember без моделей данных.

У меня есть свои собственные модели, и они создаются функцией маршрутной модели.

Однако сохранение состояния между объектами frontend и объектами backend является кошмаром. Особенно, когда один маршрут использует другие модели маршрутов.

  • Как это может быть достигнуто, следует ли написать собственный метод поиска на складе и модели?
  • Должен ли я использовать данные Ember (хотя это не в версии 1.0?), возможно, ETA на Ember Data 1.0?
  • написать код для обновления моделей на интерфейсе каждый раз, когда я меняю модель?
  • Другой метод?

Я делаю лучшие практики, или я должен делать это по-другому? Я чувствую, что без использования Ember Data я должен написать свой собственный магазин. Мне бы очень хотелось получить отзывы от некоторых из вас, ребята.

Пример модели:

App.Person = Ember.Object.extend(App.Serializable,Em.Copyable,{
  user_email : null //used in routing dynamic segements and as old email when making changes to email
  ,first_name: null
  , last_name: null
  , fullname : function () {
    return this.first_name + ' ' + this.last_name;
  }.property('first_name','last_name').cacheable()
};

App.Person.reopenClass({
  createRecord: function(data) {
    return App.Person.create({
      user_email : data.email
      , first_name: data.first_name
      , last_name : data.last_name
}});

Пример того, как я загружаю модели класса:

App.UsersRoute = App.AuthenticatedRoute.extend( {
  model : function () {
    return new Ember.RSVP.Promise(function(resolve, reject) {
      $.getJSON('/users').then(function(usersData) {
        var userObjects = [];
          usersData.forEach(function (data) {
            userObjects.pushObject(App.Person.createRecord(data));
          });
        resolve( userObjects);
        },function(error) {
          reject(error);
      });
    })
  },

Подпрограммы используют модель:

App.UsersAvailableRoute = App.AuthenticatedRoute.extend( {
     model : function () {
        return {
          allUsers :  Ember.ArrayController.create({
            content : this.modelFor('users').filter( function (user) {
                      return user.availablity === 100
                      }),

Пример того, как я обновляю модель в контроллере:

App.UsersAvailableController = Ember.ArrayController.extend({
needs : ['users']
    ,applyPersonAssign : function (person,need,project) {
          need.set('allocated',person);
          var updateObject = Ember.copy(project,true);
          if (Ember.isEmpty(need.get('inProject'))) {
            updateObject.projectNeeds.pushObject(need);
          }

          return $.ajax({
            url: '/projects/' + updateObject.get('codename'),
            "type": "PUT",
            "dataType": "json",
            data: updateObject.serialize()
          })
4b9b3361

Ответ 1

Вам не обязательно восстанавливать хранилище Ember Data. Ember отлично работает с POJO, вы также можете обернуть ваши POJO в объект Ember, чтобы дать вам некоторые интересные встроенные функции.

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

Вот пример, когда я создаю адаптер, поддерживающий кеширование. Вы можете постепенно использовать концепцию для всех основных вещей, которые вам нужны.

App.FooAdapter = Ember.Object.extend({
  cache:{},
  find: function(id){
    var self = this,
        record;
    if(record = this.cache[id]){
      return Ember.RSVP.cast(record);
    }
    else
    {
      return new Ember.RSVP.Promise(function(resolve){
        resolve($.getJSON('http://www.foolandia.com/foooo/' + id));
      }).then(function(result){
        record = self.cache[id] = App.Foo.create(result);
        return record;
      });
    }
  }
});

В приведенных ниже примерах я использую контейнер для регистрации адаптера на всех моих маршрутах/контроллерах, поэтому у меня был ленивый легкий доступ к нему.

http://emberjs.jsbin.com/OxIDiVU/742/edit

Если вы всегда хотите, чтобы это было обещание:

http://emberjs.jsbin.com/OxIDiVU/740/edit

Многократное использование

В приведенном выше примере может показаться, что вам нужно будет потратить кучу работы, но не забывайте, что Ember супер многократно используется, воспользовавшись магией.

App.MyRestAdapter = Em.Object.extend({
  type: undefined,
  find: function(id){
    $.getJSON('http://www.foolandia.com/' + this.get('type') + '/' + id
  }
});

App.FooAdapter = App.MyRestAdapter.extend({
  type: 'foo' // this would create calls to: http://www.foolandia.com/foo/1
});

App.BarAdapter = App.MyRestAdapter.extend({
  type: 'bar' // this would create calls to: http://www.foolandia.com/bar/1
});

Это основная идея того, что такое Ember Data/Ember Model. Они пытались создать тонну дефолтов и встроены в прохладу, но иногда это излишне, особенно если вы просто потребляете данные и не делаете CRUD.

Пример: http://emberjs.jsbin.com/OxIDiVU/744/edit

Также вы можете прочитать это (говорит то же самое):

Как создать пользовательский адаптер для ember.js?

Ответ 2

Где я работаю, мы используем Ember Data и Ember CLI, несмотря на то, что они довольно нестабильны. До сих пор Ember Data не вызывала здесь слишком много боли и страданий. Магазин довольно легко понять, и документация на Ember для этой грани структуры довольно хорошая. Единственная проблема, которую я испытываю, связана с динамической сортировкой моделей, и когда я изменяю их содержимое, они меняются в соответствии с изменениями, которые я делаю, а где-то по дороге происходит что-то действительно странное, не уверен, что этот Ember Ошибка данных.

Короче говоря, мы нашли некоторый успех, используя Ember Data, и не можем жаловаться на него, если этот маршрут вы хотите.

Ответ 3

Если вы знакомы с Ruby, Rails - отличное решение для бэкэнд.

Сообщество ember поддерживает рельсы с ember-rails gem, который позволяет использовать рельсы в качестве средства для обслуживания JSON.

Начало работы

  • Добавить жемчужину в ваше приложение Gemfile:

    gem 'ember-rails' gem 'ember-source', '~ > 1.9.0' # или версия, которая вам нужна

  • Выполнить bundle install

  • Затем создайте структуру приложения:

    рельсы генерируют ember: bootstrap

  • Перезагрузите сервер (если он запущен)

Построение нового проекта с нуля

Rails поддерживает возможность создания проектов из файла ruby ​​файла шаблона.

Чтобы создать проект Ember centric Rails, вы можете просто ввести следующее в свою командную строку:

rails new my_app -m http://emberjs.com/edge_template.rb

Чтобы установить последние сборки данных ember и ember-data. Следует отметить, что примеры в руководстве по началу работы были разработаны для использования выпущенной версии ember:

rails generate ember:install

Затем все, что вам нужно сделать, это рендеринг json в ваших контроллерах, например

class ProjectsController < ApplicationController
    def index
        respond_to do |format|
            format.json { render json: Project.all }
        end
    end

    def show
        respond_to do |format|
            format.json { render json: Project.where(name: params[:name])}
        end
    end
end

обязательно обновите сериализаторы

class ProjectSerializer < ApplicationSerializer
  attributes :id, :name, :description, :imgUrl, :deployUrl
end 

настроить маршруты

EmberRailsBlog.ProjectsRoute = Ember.Route.extend({
    model: function(){
        return this.store.find('project');
    }
});

и, наконец, ваша модель

var attr = DS.attr;

EmberRailsBlog.Project = DS.Model.extend({
    name: attr(),
    description: attr(),
    imgUrl: attr(),
    deployUrl: attr()
});