我使用来自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文件正在加载。
感谢您的帮助! 奥列格
答案 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();
我在寻找其他东西时遇到了这个问题,但目前接受的答案让我疯狂。没有充分的理由在代码上撒上this
和that
。 Backbone(下划线)包含一个可以绑定的上下文参数。
that = this
毫无意义。如果您必须实施过时的2007年代Crockford模式,请说var self = this
。说that = this
就像在说left = right
。每个人都停下来。