Backbone.js просматривать переменные экземпляра? - PullRequest
13 голосов
/ 03 октября 2011

Я изучаю 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 Ответ

17 голосов
/ 03 октября 2011

Ваша переменная 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.

Назначение this.view_templates в вашем конструкторе (initialize) необходимо, потому что вы, вероятно, хотите, чтобы каждый экземпляр представления имел свой собственныйкопия массива.Создание нового экземпляра представления не делает глубокую копию представления, поэтому, если у вас просто есть:

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

, тогда все экземпляры в конечном итоге будут использовать один и тот же объект view_templates, а view_templatesведут себя больше как переменная класса, чем переменная экземпляра.

Вы можете указать переменные экземпляра в определении представления (т. е. вызов Backbone.View.extend()) как форму документации, но вы захотите инициализировать любую из них, котораядолжен вести себя как переменная экземпляра в вашем методе initialize;Только для чтения или «переменные класса», такие как events, можно оставить как часть определения представления.

...