javascript - 为什么重置表单不会清除绑定(bind)的模型属性

标签 javascript backbone.js backbone-model backbone-stickit

我已使用backbone-stickit 绑定(bind)将表单中的文本输入绑定(bind)到 Backbone 模型:

bindings: {
    '#txtRemarks': 'remarks',
    '#txtFromAccountNumber': 'account_no',
    '#fileChooser':'fileChooser'
}

当我重置表单时,文本输入中的值将被清除,但这些值仍然存在于模型属性中。

最佳答案

Stickit 输入元素的默认处理程序是 ( source ):

{
    selector: 'input',
    events: ['propertychange', 'input', 'change'],
    update: function($el, val) { $el.val(val); },
    getVal: function($el) {
        return $el.val();
    }
}

它监听'propertychange'、'input'、'change'并且表单重置不会触发这些事件。

您需要手动监听表单的reset事件并手动更新模型。

var FormView = Backbone.View.extend({
    bindings: { /* ... */ },
    events: {
        '#form-id reset': 'onReset',
    },
    ui: {
        remarks: '.remarks-input',
        account: '.account-input'
    },

    onReset: function(e) {
        this.model.set({
            remarks: this.getUI('remarks').val(),
            account: this.getUI('account').val(),
        });
    }
});

处理表单时的另一个技巧是在进行任何更改之前将模型的副本保留在其初始状态。然后您可以使用副本重置属性或检查是否有更改。

var FormView = Backbone.View.extend({
    bindings: { /* ... */ },
    events: {
        '#form-id reset': 'onReset',
    },
    initialize: function() {
        this.master = this.model.clone();
    },

    onReset: function(e) {
        this.model.set(this.master.attributes);
    },
    getChanges: function() {
        return this.master.changedAttributes(this.model.attributes);
    },
    isDirty: function() {
        return Boolean(this.getChanges());
    },
});

关于javascript - 为什么重置表单不会清除绑定(bind)的模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47905695/

相关文章:

javascript - React/Redux 链接第二个 API 请求和调度

javascript - Marionette/Backbone 应用程序导致服务器(套接字)过载

javascript - 查找在 Backbone 集合中没有属性的模型

javascript - ng-repeat 带有基于 $scope 列表的过滤器

javascript - 在多个选择之间移动项目

javascript - keyPress 事件未在 Android 移动设备中触发

javascript - model.on ('change' 、 function()) 无法正常工作

javascript - 模型创建新行而不是进行编辑

javascript - 安卓浏览器 : touchcancel being fired althought touchmove has preventDefault

javascript - 在 Backbone 中渲染集合的最佳方法