我正在将Mustache.js与Backbone.js一起用于我的应用的模板系统。我将模板存储在<script></script>
块内的外部.html文件中。每个脚本块都有一个唯一的ID,我用它来使用jQuery.get()获取模板。
所以我的视图渲染功能如下所示:
render: function(){
$.get('templates/templates.html', function(templates) {
try {
var template = $(templates).filter('#tpl-MediaView').html();
return mustache.render(template, this.model.toJSON());
this.playlist.each(function(media) {
var mediaView = new MediaView({model: media});
this.$('#playlist').append(mediaView.render());
});
} catch(e) {
alert(e.message);
}
});
}
我遇到问题的问题是从$ .get()内部访问this.model.toJSON
。我已经尝试将值赋给外部的变量并将其传入。我也试过在外面运行返回。我也尝试过使用$ .ajax()。处理此范围问题的最简单方法是什么?
- 更新 -
我应该补充一点,我通过此代码收到的错误是:
无法调用未定义的方法'toJSON'
答案 0 :(得分:3)
无法调用未定义的方法'toJSON'
这意味着this.model
返回undefined,这意味着this
不是您的想法。遗憾的是,这实际上是全球性的对象。无论何时传递函数引用,都会丢失上下文。
你有吗?因为声音正确,以及通常如何做到这一点。我已尝试将值分配给外部变量并将其传入。
通常将this
保存到封闭函数之外的局部变量中。然后在函数中使用它而不是self。
render: function(){
var self = this; // or some like "var that = this"
$.get('templates/templates.html', function(templates) {
//...
self.model.toJSON()
//...
});
}
您还可以bind
对特定上下文执行操作,但并非所有浏览器/运行时都完全支持此功能。
render: function(){
$.get('templates/templates.html', function(templates) {
//...
this.model.toJSON()
//...
}.bind(this));
}
而且我知道你在这里没有问过CoffeeScript,但是如果你觉得转换它有一个非常棒的功能来解决这个问题。箭头->
声明了一个正常的函数,但是胖箭头=>
声明了一个绑定函数,它保留了函数外部的this
,基本上为你做了var self = this
诀窍无形。所以这段代码就可以了。
render: ->
$.get 'templates/templates.html', (templates) =>
# ...
this.model.toJSON()
# ...