X-editable 自定义字段类型不尊重覆盖的默认值

Posted

技术标签:

【中文标题】X-editable 自定义字段类型不尊重覆盖的默认值【英文标题】:X-editable custom field type not respecting overridden defaults 【发布时间】:2013-07-13 07:08:23 【问题描述】:

我有一个自定义 x 可编辑输入类型,用于输入城市并选择呈现如下所示的国家/地区:

注意底部的按钮;这是因为初始化代码包含showbuttons: 'bottom':

$('#location').editable(
    url: '/post',
    title: 'Enter city and country',
    showbuttons: 'bottom',
    value: 
        city: "Napier",
        country: "nz"
    ,
    sourceCountry: [
        value: "af", text: "Afghanistan",
        ...
        value: "zw", text: "Zimbabwe"
    ]
);

但是对于这个小部件来说,在侧面渲染按钮是没有意义的;所以我希望按钮默认在那里; 因此我尝试为这种可编辑类型设置默认值:

Location.defaults = $.extend(, $.fn.editabletypes.abstractinput.defaults, 
    tpl: '' +
        '<div class="editable-location">' +
        '<label><span>City: </span><input type="text" name="city"></label>' +
        '</div>' +
        '<div class="editable-location">' +
        '<label><span>Country: </span><select name="country"></select></label>' +
        '</div>',

    inputclass: '',
    showbuttons: 'bottom',
    sourceCountry: []
);

但是showbuttons 键被忽略了;其他人都很好,但不是这个。那么如何设置可编辑类型的默认值呢?

这是可编辑的代码,

(function ($) 
    "use strict";

    var Location = function (options) 
        this.sourceCountryData = options.sourceCountry;
        this.init('location', options, Location.defaults);
    ;

    //inherit from Abstract input
    $.fn.editableutils.inherit(Location, $.fn.editabletypes.abstractinput);

    $.extend(Location.prototype, 

        render: function () 
            this.$input = this.$tpl.find('input');
            this.$list = this.$tpl.find('select');

            this.$list.empty();

            var fillItems = function ($el, data) 
                if ($.isArray(data)) 
                    for (var i = 0; i < data.length; i++) 
                        if (data[i].children) 
                            $el.append(fillItems($('<optgroup>', 
                                label: data[i].text
                            ), data[i].children));
                         else 
                            $el.append($('<option>', 
                                value: data[i].value
                            ).text(data[i].text));
                        
                    
                
                return $el;
            ;

            fillItems(this.$list, this.sourceCountryData);


        ,

        value2html: function (value, element) 
            if (!value) 
                $(element).empty();
                return;
            
            var countryText = value.country;
            $.each(this.sourceCountryData, function (i, v) 
                if (v.value == countryText) 
                    countryText = v.text.toUpperCase();
                
            );
            var html = $('<div>').text(value.city).html() + ' / ' + $('<div>').text(countryText).html();
            $(element).html(html);
        ,

        html2value: function (html) 
            return null;
        ,

        value2str: function (value) 
            var str = '';
            if (value) 
                for (var k in value) 
                    str = str + k + ':' + value[k] + ';';
                
            
            return str;
        ,

        str2value: function (str) 
            return str;
        ,

        value2input: function (value) 
            if (!value) 
                return;
            
            this.$input.filter('[name="city"]').val(value.city);
            this.$list.val(value.country);
        ,

        input2value: function () 
            return 
                city: this.$input.filter('[name="city"]').val(),
                country: this.$list.val()
            ;
        ,

        activate: function () 
            this.$input.filter('[name="city"]').focus();
        ,

        autosubmit: function () 
            this.$input.keydown(function (e) 
                if (e.which === 13) 
                    $(this).closest('form').submit();
                
            );
        
    );

    Location.defaults = $.extend(, $.fn.editabletypes.abstractinput.defaults, 
        tpl: '' +
            '<div class="editable-location">' +
            '<label><span>City: </span><input type="text" name="city"></label>' +
            '</div>' +
            '<div class="editable-location">' +
            '<label><span>Country: </span><select name="country"></select></label>' +
            '</div>',

        inputclass: '',
        showbuttons: 'bottom', //WHY ISN'T THIS WORKING!!!
        sourceCountry: []
    );

    $.fn.editabletypes.location = Location;

(window.jQuery));

【问题讨论】:

我去了你的 jsfiddle,我看到了底部的按钮。这不是你想要的行为吗? 他发了一个,但它是 404,所以我删除了它。 确定一下,您使用的是 x-editable 1.1.1+ 版本吗? 【参考方案1】:

您可能有旧版本的 x-editable。您可以在用于将其包含在文档的 &lt;head&gt; 中的链接中找到版本。

只有 1.1.1 及更高版本支持 showbuttons 命令。

如果这不是问题,请告诉我,我会看看我还能解决什么问题。

【讨论】:

以上是关于X-editable 自定义字段类型不尊重覆盖的默认值的主要内容,如果未能解决你的问题,请参考以下文章

覆盖由内置 UIActivity 类型执行的活动

自定义 X-editable (AngularJS) 的取消代码按钮

在 x-editable 中发送自定义参数

X-Editable:将事件附加到数据更改

Ember 关系在测试环境中不尊重模型自定义适配器

std::set 插入器不尊重自定义比较器。 (可能的编译器错误?)