0

我有一个如下模型:

function Foo() {
    var self = this;    

    self.options = [{id: 1, text: "lorem"}, {id: 2, text: "ipsum"}];
    self.selectedValue = ko.observable(initialValue);

    self.selectedObject = ko.computed(function () {
        return ko.utils.arrayFilter(self.fields, function (f) {
            return f.id == self.selectedValue();
        })[0];
    });
}

当然,这与 a 绑定select

<select data-bind="options: options, 
                   optionsText: 'text',
                   optionsValue: 'id',
                   value: selectedValue">

hack 是因为我有另一个绑定(在不同的ko.computed对象中,未显示)需要访问完整的对象,而值需要是一个普通的 Id,所以它可以提交(我使用的是标准form,而不是自定义调用)

我想摆脱黑客(我正在其他几个地方这样做)。理想情况下,我会在我的模型中定义一个selected属性,该属性将具有对象,但select提交时该值是正确的。

它也必须以两种方式工作:我可能有一个初始值可供选择。

这是可行的吗?我应该研究自定义绑定吗?它已经存在了吗?

我可以反过来做(即就像我现在做的那样),但我希望它更干净。我想我可以只写一个lookup(array, property, value)助手,但也许有更好的方法。

4

1 回答 1

0

我认为您可以使用扩展器。比如下面这个:

ko.extenders.plainObject = function(target, options) {
    target.plainValue = function() {
        return ko.utils.arrayFilter(options, function (f) {
            return f.id == target();
        })[0];        
    }
    return target;
};

像往常一样,您只需调用 selectedValue.plainValue() 来获取对象,然后调用 selectedValue() 来获取 id。请看看这个jsfiddle:http: //jsfiddle.net/C5f98/2/

您可以在任何地方重复使用扩展器。

编辑:您甚至可以通过将要比较的字段作为选项传递来使其更通用(而不是硬编码“id”)。例如:http: //jsfiddle.net/pUudD/

于 2013-07-05T11:49:57.330 回答