1

我从 Freeman 的 Pro Javascript for WebApps 中获取了一个自定义绑定,它基本上为属性添加了前缀和/或后缀

ko.bindingHandlers.formatAttr = {
    init: function(element, accessor) {
        $(element).attr(accessor().attr, composeString(accessor()));
    },
    update: function(element, accessor) {
        $(element).attr(accessor().attr, composeString(accessor()));
    }
};

使用这个 javascript 函数

function composeString(bindingConfig) {
    var result = bindingConfig.value;
    if (bindingConfig.prefix) {
        result = bindingConfig.prefix + result;
    }
    if (bindingConfig.suffix) {
        result += bindingConfig.suffix;
    }
    return result;
}

它工作正常,例如

<input data-bind="formatAttr: { attr: 'id', prefix: 'InterestedParty_', suffix: '__Id', value: $data.Guid }" type="hidden"/>

但是我怎样才能使它适用于同一输入中的两个不同属性呢?我尝试了一些事情,但要么失败,要么只接受最后一个。我可以为每个属性创建一个自定义属性,但这样我就会失去它的普遍性。

谢谢

4

1 回答 1

1

您可以在一些 jQuery 的帮助下扩展您的绑定处理程序以使用数组:

ko.bindingHandlers.formatAttr = {
    init: function(element, accessor) {
        var value = accessor();
        if (!$.isArray(value))
            value = [value]

        $.each(value, function(index, item){
            $(element).attr(item.attr, composeString(item));
        });

    },
    update: function(element, accessor) {
        var value = accessor();
        if (!$.isArray(value))
            value = [value]

       $.each(value, function(index, item){
            $(element).attr(item.attr, composeString(item));
       });
    }
};

所以现在你可以将一个{ attr, prefix, suffix, value }对象数组作为参数传递给你的绑定:

<input data-bind="formatAttr: [
   { attr: 'id', prefix: 'InterestedParty_', suffix: '__Id', value: $data.Guid },
   { attr: 'name', prefix: 'Other_', suffix: '__Name', value: $data.Name }]"
   type="hidden" />

演示JSFiddle

于 2013-06-17T15:07:12.763 回答