1

backbone.js からのフェッチを使用して json モデルをロードしますが、成功しません。

var DialogModel = Backbone.Model.extend({
    url : function() {
        return '/messages/getDialog';
    },
    parse : function(res) { 
        return res.dialog;
    }
});

var DialogView = Backbone.View.extend({
    el: $("#page"),
    initialize: function() {
        var onDataHandler = function() {
            this.render();
        };
        this.model = new DialogModel();
        this.model.fetch({ success : onDataHandler});
      },
    render: function(){
        var data = {
                dialogModel : this.model
              };
        var form = new Backbone.Form({
             model: data
        });
        $(this.el).html(form.render().el);
    }
});

何が起こるか: DialogView initialize が呼び出されます。this.model.fetch が呼び出されますが、成功すると onDataHandler 関数はヒットしません。/messages/getDialog は json ファイルを返します。ネットワーク ブラウザで確認できるように、json ファイルは正常にロードされています。

ご協力いただきありがとうございます!オレグ

4

2 に答える 2

1

あなたが抱えている問題は、典型的な JS の問題によるものであり、バックボーン自体とは関係ありません。試す

var that = this;
this.model.fetch({ 
    success : function () {
        that.render();
    }
});

関数が呼び出されたときに、の代わりにグローバルオブジェクトを参照するようになるため、現在渡している方法にonDataHandlerは問題があります。thisDialogView

このフィドルは、問題のあるバージョンと機能するバージョンを示しています。

(この種のエラーから身を守ることができるJS strict モードも参照してください。)

于 2013-07-09T13:11:31.610 に答える
0

さらに良いのは、イベントをリッスンすることです。

this.model.on("sync", this.render).fetch();

何か他のものを探しているときにこの質問に出くわしましたが、現在受け入れられている答えは私を夢中にさせます. コード全体thisに散らばる正当な理由はありません。thatバックボーン (アンダースコア) には、バインドできるコンテキスト パラメーターが含まれています。

that = this意味がありません。廃止された 2007 年時代の Crockford パターンを実装する必要がある場合は、 var self = this. 言うthat = thisことは言うようなものleft = rightです。みんなやめて。

于 2013-08-11T02:31:42.653 に答える