requireJS这个上下文在回调中发生了变化

时间:2013-11-29 13:45:51

标签: javascript scope requirejs this

我有以下代码:

require([templateName], function(template, view){
    console.log(this); // outputs Window object
    this.renderTemplate(template, {
        articles: this.collection.toJSON() // rises error
    });
});

现在为了完成这项工作,我需要改变'this'上下文,因为它不在其中。如何实现呢?

///编辑 - 完整代码

define(['jquery', 'backbone', 'underscore', 'article/collections/Articles', 'generic-view-decorator','error-handler-decorator'],
function($, Backbone, _, ArticlesCollection,  GenericViewDecorator, ErrorHelperDecorator) {
    var ArticleView = Backbone.View.extend({
        initialize: function(config) {
            this.initializeCollection(ArticlesCollection, this.buildResourceUrl({
                domain : 'oskszu.vgnett.no',
                path : 'vgnett-dt/'+config.config.section + '/json',
                query : [{
                    key : 'limit',
                    val : config.config.limit
                }]
            }));
            this.initializeErrorCapturing(this.collection);
        },
        render: function() {
            if(!this.collection.length) {
                this.trigger('error-600');
            } else {
                var templateName = 'text!widgets/widgets/article/templates/article.tpl';
                require([templateName]).call(this, function(template){
                    console.log(this);
                    /*this.renderTemplate(template, {
                        articles: this.collection.toJSON()
                    });*/
                }, this);
            }
        }
    });

    _.extend(ArticleView.prototype, GenericViewDecorator);
    _.extend(ArticleView.prototype, ErrorHelperDecorator);

    return ArticleView;
}
);

1 个答案:

答案 0 :(得分:0)

好的,我已经通过以下方式解决了这个问题(对于后代;)):

        render: function() {
            if(!this.collection.length) {
                this.trigger('error-600');
            } else {
                var templateName = 'text!widgets/widgets/article/templates/article.tpl';
                require([templateName], (function(template){
                    console.log(this);
                    /*this.renderTemplate(template, {
                        articles: this.collection.toJSON()
                    });*/
                }).call(this));
            }
        }