1

現在解決済み - 下を参照してください....

編集要素を表示するボタンが付いたバックボーン リスト ビューがあります。

「showAddEntry」関数の jQuery hide() 呼び出しも、「versionEditView」のビュー レンダリングもまったく何もしていません。私はすぐにステップスルーしましたが、エラーは発生していません。コンソールでメソッドを手動で実行して、hide で何が起こっているかを確認することさえ試みましたが、どこにも行きません。

主なビューは次のとおりです...

define(['ministry', 'jquery', 'models/m-version-info', 'views/about/v-edit-version-info-entry', 'text!templates/version-info/version-info.html'],
function(Ministry, $, VersionInfo, VersionInfoEditView, TemplateSource) {
    var versionInfoEntriesView = Ministry.View.extend({

        el: '#mainAppArea',

        template: Handlebars.compile(TemplateSource),

        versionInfoEditView: null,

        initialize: function () {
            this.$addEntryArea = $('#addVersionInfoEntryArea');
            this.$addEntryButton = $('#addVersionInfoEntryButton');
        },

        events: {
            'click #addVersionInfoEntryButton': 'showAddEntry'
        },

        render: function () {
            var that = this;
            var entries = new VersionInfo.Collection();

            entries.fetch({
                success: function (data) {
                    that.$el.html(that.template({ items: data.toJSON() }));
                }
            });

            return this;
        },

        showAddEntry: function() {
            if (this.versionInfoEditView != null) {
                this.versionInfoEditView.trash();
            }

            this.versionInfoEditView = new VersionInfoEditView({ el: this.$addEntryArea });
            this.$addEntryButton.hide();
            this.versionInfoEditView.render();
            return false;
        }
    });

    return versionInfoEntriesView;
});

そして、これが子ビューです...

define(['ministry', 'models/m-version-info', 'text!templates/version-info/edit-version-info-  entry.html', 'jquery.custom'],
function (Ministry, VersionInfo, TemplateSource) {

    var editVersionInfoView = Ministry.View.extend({

        template: Handlebars.compile(TemplateSource),

        initialize: function () {
            this.$dbVersionInput = this.$('#dbVersion');
            this.$tagInput = this.$('#tag');
        },

        render: function () {
            this.$el.html(this.template());
            return this;
        },

        events: {
            'submit .edit-version-info-form': 'saveEntry'
        },

        saveEntry: function() {
            var entry = new VersionInfo.Model({ dbVersion: this.$dbVersionInput.val(), tag: this.$tagInput.val() });
            entry.save({
                success: function() {
                    alert('Your item has been saved');
                }
            });
            return false;
        }
    });

    return editVersionInfoView;
});

そしてメインテンプレ…

<h2>Version Info</h2>
<div id="info">
    <a id="addVersionInfoEntryButton" href="#/versioninfo">Add manual entry</a>
    <div id="addVersionInfoEntryArea">
    </div>
    <ul id="items">
        {{#each items}}
        <li>{{dbVersion}} | {{tag}}</li>
        {{/each}}
    </ul>
</div>

そして、編集テンプレート...

<form class="edit-version-info-form">
    <h3>Create a new entry</h3>
    <label for="dbVersion">DB Version</label>
    <input type="text" id="dbVersion" maxlength="10" />
    <label for="tag">Tag</label>
    <input type="text" id="tag" />
    <button type="submit" id="newEntryButton">Create</button>
</form>

私はバックボーンにかなり慣れていないので、まったく間違ったことをしている可能性がありますが、これまでのところアプローチに問題はなく、エラーも発生していません。

OK - 顔をパーミングした後、次のように修正します...

define(['ministry', 'jquery', 'models/m-version-info', 'views/about/v-edit-version-info-entry', 'text!templates/version-info/version-info.html'],
function(Ministry, $, VersionInfo, VersionInfoEditView, TemplateSource) {
    var versionInfoEntriesView = Ministry.View.extend({

        el: '#mainAppArea',

        template: Handlebars.compile(TemplateSource),

        versionInfoEditView: null,

        $addEntryArea: undefined, 
        $addEntryButton: undefined,

        initialize: function () {
        },

        events: {
            'click #addVersionInfoEntryButton': 'showAddEntry'
        },

        render: function () {
            var that = this;
            var entries = new VersionInfo.Collection();

            entries.fetch({
                success: function (data) {
                    that.$el.html(that.template({ items: data.toJSON() }));
                    that.$addEntryArea = that.$('#addVersionInfoEntryArea');
                    that.$addEntryButton = that.$('#addVersionInfoEntryButton');
                }
            });

            return this;
        },

        showAddEntry: function (e) {
            e.preventDefault();
            if (this.versionInfoEditView != null) {
                this.versionInfoEditView.trash();
            }

            this.versionInfoEditView = new VersionInfoEditView({ el: this.$addEntryArea });
            this.$addEntryButton.hide();
            this.$addEntryArea.append('Do I want to put it here?');
            this.versionInfoEditView.render();
        }
    });

    return versionInfoEntriesView;
});

この問題は、レンダリングが完了する前にビュー内で内部要素変数を設定していたため、要素が何もリンクされていなかったことが原因でした。要素の開始をレンダリング成功コールバックの最後に抽出することで、これを解決しました。

4

1 に答える 1