backbone.js获取json成功不会命中

时间:2013-07-09 12:54:48

标签: json backbone.js fetch

我使用来自backbone.js的fetch来加载一个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初始化。 调用this.model.fetch但是如果成功则不会命中onDataHandler函数。 / messages / getDialog抛出一个json文件。 正如我在网络浏览器中看到的那样,json文件正在加载。

感谢您的帮助! 奥列格

2 个答案:

答案 0 :(得分:1)

您遇到的问题是由于典型的JS问题并且与Backbone本身无关。尝试

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

您当前传递onDataHandler的方式存在问题,因为当调用该函数时,它会导致this引用全局对象而不是DialogView

fiddle演示了有问题的版本与有效的版本。

(您可能还想看看JS strict mode,它可以保护您免受此类错误的影响。)

答案 1 :(得分:0)

更好的是听一个事件:

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

我在寻找其他东西时遇到了这个问题,但目前接受的答案让我疯狂。没有充分的理由在代码上撒上thisthat。 Backbone(下划线)包含一个可以绑定的上下文参数。

that = this毫无意义。如果您必须实施过时的2007年代Crockford模式,请说var self = this。说that = this就像在说left = right。每个人都停下来。