2014-01-20 3 views
5

Я использую Ember App Kit. У меня есть форма, которая принимает имя студента, и я могу без проблем сохранить данные в базе данных. Проблема заключается в том, что данные (имя студента) сохраняются в форме всякий раз, когда я возвращаюсь к этому маршруту (http://localhost:8000/#/students/new) с другой страницы. Если я обновляю экран, данные будут очищены, и я получу свежую форму. Что я делаю не так?Ember.js - Как очистить данные формы после сохранения записи?

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

//-------------------------------------------- 
// Controller 

var StudentsNewController = Ember.ObjectController.extend({ 
    init: function() { 
     var newSystem = this.store.createRecord('student'); 
     this.set('newStudent', newStudent); 
     this._super(); 
    }, 
    actions: { 
     acceptChanges: function() { 
      var self = this; 
      self.get('newStudent').save().then(function(student){ 
       self.transitionToRoute('students'); 
      }); 
     } 
    } 
}); 

export default StudentsNewController; 

//--------------------------------------------  
// Model 

var Student = DS.Model.extend({ 
    name: DS.attr('string'), 
    major: DS.belongsTo('major') 

}); 

export default Student; 

//--------------------------------------------  
// Template 

    <form {{action 'updateSystem' on="submit"}}> 
     <fieldset> 
       <div> 
        <label>Student Name</label> 
        {{input value=newStudent.name size="50"}} 
       </div> 
       <button {{action 'acceptChanges'}}>Add</button> 
     </fieldset> 
    </form> 
+0

Сохраняется ли информация в форме, сохраненной как автоматическая, или данные, введенные во ввод формы, так что если вы нажмете «Добавить», то ученик будет добавлен с этой информацией? – claptimes

+0

Пользователь должен ввести ввод (без автозавершения) и нажать «Добавить» для сохранения. – ACoder

ответ

8

Попытка установить контроллер в вас маршрут (here) вместо того, чтобы использовать метод init в контроллере. Это одна из задач маршрута.

Я думаю, проблема заключается в том, что вы предполагаете, что каждый раз, когда вы переходите на StudentsNewRoute, создается новый StudentsNewController, и поэтому вызывается метод init.

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

Чтобы решить эту проблему вы могли бы сделать что-то вроде этого:

var StudentsNewController = Ember.ObjectController.extend({ 
    newStudent: null, 
    actions: { 
     acceptChanges: function() { 
      this.get('newStudent').save().then((student) => { 
       this.transitionToRoute('students'); 
      }); 
     } 
    } 
}); 
//-------------------------------------------- 
var StudentsNewRoute = Ember.Route.extend({ 

    model: function() { 
     return this.store.createRecord('student'); 
    }, 

    setupController: function(controller, model) { 
     controller.set('newStudent', model); 
    }, 
}); 

Я надеюсь, что это поможет вам!

+0

Я последовал твоему предложению, но я получил эту ошибку: Утверждение не выполнено: утверждение не выполнено: не удалось делегировать set ('newStudent', <(подкласс DS.Model): ember488: null>) в свойство content для прокси-объекта объекта : его «контент» не определен. Структура файла: контроллеры/студентов/new.js маршруты/студентов/new.js Почему это жалуются, что? – ACoder

+0

Я получил ошибку выше, но исправил ее добавлением «newStudent» в контроллер. Форма понятна после сохранения записи или возврата на этот маршрут. БЛАГОДАРЯ! – ACoder

+4

Хорошее решение, однако что вы делаете, если ваша форма заполняется пользователем посредством привязок на контроллере и не заполняется моделью? Также целесообразно использовать 'setupController' для очистки этих связанных переменных? – neverfox

0
actions: { 
    acceptChanges: function() { 
     var self = this; 
     self.get('newStudent').save().then(function(student){ 
      self.set('newStudent',''); 
      self.transitionToRoute('students'); 
     }); 
    } 
} 
+0

Спасибо @Stakoov. Как только я использовал код, предоставленный edpaez выше, форма очищается каждый раз, когда я туда иду. – ACoder

+0

** @ Stakoov **, ваш код, похоже, не работает для меня. Страница загружается пустым. – ACoder

+0

затем лоток для установки newStudent в null – Stakoov

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