1

现已解决 - 见底部....

我有一个 Backbone 列表视图,上面有一个按钮,应该显示编辑元素。

'showAddEntry' 函数中的 jQuery hide() 调用或 'versionEditView' 的视图渲染都没有做任何事情。我已经通过了,我没有收到任何错误。我什至尝试在控制台中手动运行方法以查看隐藏发生了什么,但我没有得到任何结果。

这是主视图...

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>

我对骨干很陌生,所以我很可能做错了什么,但到目前为止我看不出这种方法有什么问题,也没有抛出任何错误。

好的 - 在一些面部护理后修复如下......

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

0

这又是修复...

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;
});

问题是由于我在渲染完成之前在视图中设置了内部元素变量,所以元素没有链接。我通过将元素初始化提取到渲染成功回调结束来解决了这个问题。

于 2013-07-17T11:55:04.420 回答