2014-01-20 14 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

セットアップする代わりに、コントローラにinit方法を使用してのあなたのルート(here)のコントローラを試してみてください。それはルートの責任の1つです。

StudentsNewRouteに変更するたびに新しいStudentsNewControllerが作成され、したがってinitメソッドが呼び出されるという問題があると思います。

真実Emberはコントローラを一度作成し、modelsetupControllerフックに基づいてコンテンツを変更します。したがってコントローラのメソッドinitは一度呼び出され、ルートに移行するたびに同じレコードで終了します。この問題を解決するには

あなたはこのような何かしたい:私はこれがあなたの役に立てば幸い

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

あなたの提案に従いましたが、このエラーが発生しました: アサーションに失敗しました:アサーションに失敗しました:オブジェクトプロキシの 'content'プロパティに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

関連する問題