0

メソッドを介して他のビューをロードする「マスター」ビュー、場合によってはレイアウトがありますloadViewinitialize私の問題は、これらのビュー クラスが、(テンプレート化のために) 1 回しか実行できないいくつかの初期化ロジック ( ) を実行することです。ただし、これらのクラスを複数回インスタンス化しようとすると、同じインスタンスで初期化を呼び出すというエラーの症状が発生します。

コンソールで、クラスをロードして2つの新しいインスタンスを作成することにより、それらを個別にインスタンス化しようとしましたvar x = new MyViewClass();が、最初のインスタンスがインスタンス化され、テンプレートがすでに初期化されているために発生したこのエラーのために2番目のインスタンスが失敗するたびに。

これは本当に起こってはならないことですが、私の人生では何が問題を引き起こしているのかわかりません。

レイアウトの読み込みコードは次のとおりです。

loadView: function(name, bootstrap_function) {
    this.unloadView();

    var _class  = require('View/'+name),                // Let's load the view file
        pretty  = name.replace('/', ''),                // Prettify the name by removing slashes (should end up with some camelcased niceness)
        bs_name = '__bootstrap'+pretty,                 // Generate the name of the bootstrap function
        view    = new _class();                         // Pass the event aggregator in

    // If there is a bootstrap function, bootstrap
    if(typeOf(bootstrap_function) == 'function') {      // Check if one has been passed in
        bootstrap_function.call(this, view);            // Bootstrap: function(AppView, LoadedView)
    }

    this._loaded = view;                                // Store the view in _loaded

    // Now that we have a view to play with
    // we should insert it into our container object
    view.$el.appendTo(this.$container);

    // And render!
    view.render();
},

unloadView: function() {
    if(this._loaded !== null) {
        this._loaded.remove();
        this._loaded.unbind();
        this._loaded = null;
    }
}

編集

エラーが発生しているテンプレート コードは次のとおりです。

processTemplates: function() {
    if(this.templates === undefined) return this;

    console.log(this.templates);

    if(Object.getLength(this.templates) > 0) {
        Object.each(this.templates, function(template, name) {
            this.templates[name] = _.template(template);
        }, this);
    }

    return this;
},

console.log(this.templates)出力は、最初の初期化ではthis.templates本来あるべき文字列を含んでいることを示していますが、2 回目の初期化ではテンプレート関数を示しています (これはprocessTemplates()が呼び出された後である必要があります)。

クラスの定義方法と関係があるのではないかと思います。たとえば、次のようになります。

define(
    ['backbone', 'View/Kords', 'text!Template/Pages/Landing.html', 'Collection/TenantTypes'],
    function(Backbone, KordsView, landing_html, TenantTypesCollection) {
        var LandingView = KordsView.extend({
            tagName: 'div',
            className: 'tiled-light',

            templates: {
                'main': landing_html
            },

landing_htmlクラスではこのように定義されていますが、参照の問題があるのでしょうか? スコープ内_.templateの値に影響を与えるべきではありませんか?landing_html

編集#2

Landing_htmlへの参照とは関係ありません。クラス定義でtemplates.mainを文字列に設定しようとしましたが、以前と同じようにエラーが発生しました。

4

0 に答える 0