2016-04-30 4 views
2

モデルでフェッチ操作を実行すると、目的のデータをJSON形式で返すAPIが表示されます。モデルをコンソールに記録すると、変更されたオブジェクトに新しいデータが表示されます。バックボーンフェッチモデルからレンダービューへ

前とフェッチ後:

Object { 
    cid: "c1", 
    attributes: Object, 
    _changing: false, 
    _previousAttributes: Object, 
    changed: Object, 
    id: undefined, 
    _pending: false 
} 

Object { 
    cid: "c1", 
    attributes: Object, 
    _changing: false, 
    _previousAttributes: Object, 
    changed: Object[1], 
    id: undefined, 
    _pending: false 
} 

データは明らかにフェッチされ、それがモデルに存在しています。ただし、レンダリングすると、デフォルト値が表示されます。

App.Models.Document = Backbone.Model.extend({ 

    defaults: { 
    id: '', 
    owner: 0, 
    created: '', 
    lastupdate: '', 
    content: 'Default document content' 
    }, 

    url: '/api/' 

}); 


App.Views.DocumentView = Backbone.View.extend({ 

    tagName: 'textarea', 
    className: 'editor', 

    template: App.Template('editortemplate'), 

    initialize: function() { 

    // As proposed in so many similar questions 
    this.listenTo(this.model, "change", this.render); 

    }, 
    render: function() { 

    this.$el.html(this.template(this.model.toJSON())); 

    $(".app-content").html(this.$el); 

    return this; 

    } 
}); 


a = new App.Models.Document(); 
a.fetch(); 
b = new App.Views.DocumentView({ model: a }); 
b.render(); 

新しいデータでビューを正しく更新するにはどうすればよいですか?

モデルからデフォルトを削除すると、 'content'は定義されません。

+0

それは '変更されたことを奇妙だ:'変更にObject'変更:オブジェクト[1]、 '。 APIから返されるデータの構造は何ですか? BTW idは、バックボーンによって使用される特別な属性です。 –

+0

返されたデータは、JSONオブジェクト [{ "ID" である: "所有者"、 "1": "1"、 は "作成": "2016年4月30日21時57分23秒"、 " "content": "成功したAPIフェッチ" } – hesonline

+2

これは、Backboneがモデル属性に設定する前に応答を処理するために 'parse()'を実装する必要があるか、またはフェッチする必要があることを意味します['Collection'](http://backbonejs.org/#Collection)からのそのRESTリソース。 –

答えて

1

Backbone.Modelは、オブジェクトがサーバーではなく、配列から返されることを期待しています。コレクションの場合は配列を返す必要があります。

だからあなたの場合には、データを含むオブジェクトを返すようにparseメソッドを定義する必要があります。

App.Models.Document = Backbone.Model.extend({ 
    defaults: { 
    owner: 0, 
    created: '', 
    lastupdate: '', 
    content: 'Default document content' 
    }, 
    url: '/api/', 
    parse: function(response) { 
    return response[0]; 
    } 

}); 
+0

listenToと一緒に構文解析してください。 – hesonline

1

モデル上でバックボーンsyncイベントを聞くことができます。 sync火災サーバー

this.listenTo(this.model, 'sync', this.render); 

の呼び出しが成功した後も、あなたのモデルはinitializeメソッドでは、App.Views.DocumentViewにフェッチ移動することができます。成功した場合にビューをレンダリングし、より :

App.Models.Document = Backbone.Model.extend({ 
    defaults: { 
    id: '', 
    owner: 0, 
    created: '', 
    lastupdate: '', 
    content: 'Default document content' 
    }, 

    url: '/api/' 
}); 


App.Views.DocumentView = Backbone.View.extend({ 
    tagName: 'textarea', 
    className: 'editor', 
    template: App.Template('editortemplate'), 
    initialize: function() { 
    var self = this; 

    // model fetch 
    this.model.fetch({ 
     success: function() { 
     // call render 
     self.render(); 
     }, 
     error: function() { 
     // handle error 
     } 
    }); 

    // As proposed in so many similar questions 
    this.listenTo(this.model, "change", this.render); 
    }, 
    render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
    $(".app-content").html(this.$el); 
    return this; 
    } 
}); 


var myModel = new App.Models.Document(); 
var myView = new App.Views.DocumentView({ 
    model: myModel 
}); 
myView.render(); 
+0

ありがとうYosvel。残念ながら、実際には何も変わりませんでした。 デフォルト値が表示されます。フェッチが実行され、モデルオブジェクトにはまだ変更できない値の 'changed'があります。 – hesonline

関連する問題