从$ .get w / Backbone.js中访问this.model

时间:2012-07-20 23:29:57

标签: jquery backbone.js scope mustache

我正在将Mustache.jsBackbone.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'

1 个答案:

答案 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()
        # ...