Backbone.js查看实例变量?

时间:2011-10-03 02:49:55

标签: javascript jquery backbone.js backbone-views

我正在学习Backbone.js,并试图弄清楚是否可以在Backbone视图中使用实例变量。

我的目标是在实例化视图时从外部文件加载视图的模板。目前我将它们存储在Backbone应用程序的全局命名空间中的全局变量中,但将模板存储在视图的实例变量中会更清晰。目前我的设置如下:

var templates = {};

MessageView = Backbone.View.extend({

    initialize: function() {
        $.get('js/Test2Templates.tpl', function(doc) {

            var tmpls = $(doc).filter('template');

            templates['MessageView'] = [];

            tmpls.each(function() {
                templates.MessageView[this.id] = $.jqotec($.unescapeHTML(this.innerHTML));
            });
        });
    },

    render: function() {
        var tpldata = {name: 'Ville', thing: 'Finland'};
        $('#display').jqoteapp(templates.MessageView.greeting_template, tpldata);
    },

    events: {
        "click input[type=button]": "additionalTransactions"
    },

    additionalTransactions: function() {
        this.render();
    }

});

但是我没有将“模板”定义为全局变量,而是想在视图的初始化函数中创建“模板”,沿着这些行(但这不起作用):

MessageView = Backbone.View.extend({

    view_templates: {},

    initialize: function() {
        $.get('js/Test2Templates.tpl', function(doc) {

            var tmpls = $(doc).filter('template');

            tmpls.each(function() {
                this.view_templates[this.id] = $.jqotec($.unescapeHTML(this.innerHTML));
            });
        });
    },

    render: function() {
        var tpldata = {name: 'Ville', thing: 'Suomi'};
        $('#display').jqoteapp(this.view_templates.greeting_template, tpldata);
    },

    events: {
        "click input[type=button]": "additionalTransactions"
    },

    additionalTransactions: function() {
        this.render();
    }

});

这可能(?)非常直接和/或显而易见,但我在Backbone.js学习曲线的某个地方,我非常感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:17)

您的view_templates实例变量很好(也是个好主意)。您只需确保在this回调中和$.get()来电中使用正确的tmpls.each()。我想你希望initialize更像这样:

initialize: function() {
    this.view_templates = { };

    var _this = this;
    $.get('js/Test2Templates.tpl', function(doc) {
        var tmpls = $(doc).filter('template');
        tmpls.each(function() {
            _this.view_templates[this.id] = $.jqotec($.unescapeHTML(this.innerHTML));
        });
    });
},

我不确定this.id中你想要哪个tmpls.each(),但我猜你想要当前模板中的DOM id属性,所以我把它留给了this.id 1}}。

您的构造函数(this.view_templates)中的initialize赋值是必需的,因为您可能希望视图的每个实例都拥有自己的数组副本。创建新的视图实例不会对视图执行深层复制,因此如果您只有:

MessageView = Backbone.View.extend({
    view_templates: {},
    // ...

然后所有实例最终将共享相同的view_templates对象,而view_templates的行为更像是类变量而不是实例变量。

您可以在视图定义中指定实例变量(即Backbone.View.extend()调用)作为文档的一种形式,但您需要初始化任何应该在{{1}中作为实例变量运行的实例变量} 方法;像initialize这样的只读或“类变量”可以作为视图定义的一部分。