2013-07-07 5 views
3

Вот jsfiddle демонстрация: http://jsfiddle.net/YUHLA/5/Ember.js-Why would this.get ('model') возвращает контроллер?

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

Откройте консоль и попробуйте добавить новое сообщение и сохранить его. Обратите внимание на три нечетные вхождения:

  1. Вызова Get («модель») на контроллере возвращает контроллер на линии 62.
  2. В строке 65, это показано, что новые модели не были сохранены в светильники.
  3. После создания другого сообщения с пост-контроллера и сохранения его сохраняются обе записи (строка 70).

Вот JavaScript:

window.App = Ember.Application.create(); 

App.Store = DS.Store.extend({ 
    adapter: DS.FixtureAdapter 
}); 

App.store = App.Store.create(); 

App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    body: DS.attr('string') 
}); 

App.Post.FIXTURES = [ 
    { 
    id: 1, 
    title: 'title', 
    body: 'body' 
    }, { 
    id: 2, 
    title: 'title two', 
    body: 'body two' 
    } 
]; 

App.NewPostFormView = Ember.View.extend({ 
    tagName: "form", 
    templateName: "newPostForm", 
    submit: function() { 
    this.get('controller').save(); 
    return false; 
    } 
}); 

App.ApplicationController = Ember.ObjectController.extend({ 
    posts: (function() { 
    return App.Post.find(); 
    }).property() 
}); 

App.PostsController = Ember.ArrayController.extend({ 
    sortProperties: ['id'], 
    sortAscending: false, 
    itemController: 'post', 
    newPost: function() { 
    var post; 
    return post = App.Post.createRecord({ 
     title: '', 
     body: '', 
     isEditing: true 
    }); 
    } 
}); 

App.PostController = Ember.ObjectController.extend({ 
    save: function() { 
    var temp; 
    console.log('Starting to save'); 
    console.log('this.get(\'model\') =', this.get('model')); 
    transaction = App.store.transaction(); 
    this.set('isEditing', false); 
    temp = this.get('model'); 
    temp.get('store').commit(); 
     Ember.run.next(function(){ 
      console.log('# fixtures:', App.Post.FIXTURES.length); 
      App.Post.createRecord(
       {title: 'post four', body: 'four body'} 
     ).get('store').commit() 
      Ember.run.next(function(){ 
      console.log('# fixtures:', App.Post.FIXTURES.length); 
      }); 
     }); 
    } 
}); 

ли это связано с тем, что я создаю модель от контроллера сообщений, а затем сохранить его в пост управления? Если да, то как я могу обойти это?

Спасибо!

ответ

2

Это связано с тем, что я создаю модель из контроллера сообщений, а затем сохраняю ее в пост-контроллере?

No.

  1. Вызов прибудете ('модель') на контроллере возвращает контроллер на линии 62.

справа. PostsController указал itemController: 'post', поэтому, когда шаблон столбцов итерации превышает {{each post in controller}}, сообщения обернуты в PostController. Это нормально, но не в сочетании с помощником {{render}}. Когда {{render}} используется в каждом блоке до {{render post post}}, он создает шаблон сообщения и переносит указанное значение (пост-переменную) в PostController. Таким образом, у вас есть два пост-контроллера, которые обертывают одну модель публикации. Кинда излишний.

  1. В строке 65, это показано, что новые модели не были сохранены в светильники.

Итак, вопрос заключается в том, что у вас есть два разных магазина. App.store() - глобальная переменная, которая была создана в строке 14. И поскольку она была первой, она была создана default store. Это не связано с тем, что используется вашей моделью.

В PostController.save(), this.get('model') возвращается контроллер. И магазин контроллера - это хранилище по умолчанию. Обычно это то же самое, что и магазин модели, но не в этом случае. Поэтому, когда вы вызываете get('store').commit(), который находится в хранилище по умолчанию, у которого нет моделей, так что ничего не происходит. Если у вас действительно была модель (путем исправления проблемы № 1), это было бы нормально.Или, если вы не создали App.store, это также было бы нормально, так как в этом случае хранилище по умолчанию было бы таким же, как в магазине вашей модели.

Порекомендуйте не создавать App.store() самостоятельно, так как это просто запутывает и, вероятно, не то, что вы хотите. В общем, лучше всего позволить ember создавать вещи.

  1. После создания еще один пост из почтового управления и сохранения его, оба сообщения сохраняются (строка 70).

Право. Поскольку commit() был вызван в App.store(), в хранилище App.Post по-прежнему была одна незафиксированная запись. App.createRecord ({}). Get ('store'). Commit() создает вторую запись в этом хранилище, а затем фиксирует оба.

Обновлено скрипку здесь: http://jsfiddle.net/YUHLA/7/

+1

Спасибо за ответ. 'this.get ('model'). save()', по-видимому, не делает запрос 'POST' для бэкэнд ... это должно быть так? Я сделал новую скрипку, используя транзакцию, которая работает на скрипке, но в моем приложении одна и та же процедура не делает запрос «POST» на сервере. http://jsfiddle.net/YUHLA/9/ – tobobo

+1

Ahh, оказывается, у меня были проблемы, связанные с указанием «embedded: always» в модели post для его родительской модели. Переключение на «embedded: load» позволило мне сохранить модель сообщения отдельно. Теперь мне просто нужно решить некоторые тайны, связанные с ключами, используемыми в запросах POST, и добавили ли они к ним. – tobobo

+0

Отлично, рад, что сработал. Re: используемые ключи, лучшее место для поиска - в модульном тесте для адаптера REST. Просто посмотрите на хеш ajax, который передается для каждого типа запроса. https://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js –

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