如果值为空,如何取消设置属性?

时间:2013-10-28 19:54:11

标签: javascript backbone.js marionette backbone-stickit

我有一个包含许多空字段的搜索表单。用户在字段中输入值并点击“Enter”后,我从值中创建一个查询字符串(使用$.param())并将其发送到服务器。一切顺利,直到你清空一个字段并再次点击“回车”。因为该字段之前有一个值已经设置了属性,所以现在当提交属性仍然被添加到查询字符串时,只有没有附加值。

一个例子和一些代码:

Search.CustomerCard = Marionette.ItemView.extend({
    template: "#customer-search-card",
    tagName: "section",
    className: "module primary-module is-editing",
    initialize: function () {
        this.model.on('change', function(m, v, options) {
            console.log("Changed?", m.changedAttributes();
        });
    },
    events: {
        "click .js-save": "searchCustomers",
        "keypress [contenteditable]": "searchCustomersOnEnter"
    },
    bindings: {
        …
    },
    onRender: function () {
        this.stickit();
    },
    searchCustomersOnEnter: function (e) {
        if (e.keyCode !== 13) { return; }
        e.preventDefault();
        this.searchCustomers(e);
    },
    searchCustomers: function (e) {
        e.preventDefault();
        $(e.target).blur();
        var query = $.param(this.model.attributes);
        this.trigger("customers:search", query);
    }
});

您会在var query = $.param(this.model.attributes);行中看到我正在将模型的属性转换为查询字符串以发送到我的API。您可能还会看到我正在使用backbone.stickit。如何在创建查询字符串之前无缝取消设置空的任何属性?

2 个答案:

答案 0 :(得分:2)

在这种情况下,我只需将输入修复为$ .param:

var params = _.clone(this.model.attributes);

_.each(params, function(value, key) {
    if (value == "") {
        delete params[key];
    }
});

$.param(params);

Underscore似乎没有适当的实用程序可用,但可以像here所描述的那样轻松提供。

答案 1 :(得分:0)

我在制作项目时遇到了类似的问题,因为我_.defaults工作了,但也许在你的情况下,你可以使用filter,reduce或任何其他下划线函数。