淘汰选择数据绑定

时间:2015-05-06 14:29:14

标签: javascript knockout.js

你好我有一个对象数组,它包含一些值,我想把它放在数据绑定中,然后在所选选项的id的事件更改传递中。

我到目前为止:

敲除:

 <select data-bind="options: Model.Products,
                           optionsText: 'Name',
                           event: { change: function(){Model.TestFunction(Model.Products.Id);} }"  
                               ></select>

我的对象如何构造示例:

Model.Products():
    0: Object
      Cost: 0
      Id: "2e481911-cff3-e411-80cf-000d3ab07471"
      Name: "Product 1"
    __proto__: Object

的javascript

TestFunction: function (o){

        var test = o;
    }

1 个答案:

答案 0 :(得分:3)

将observable绑定到select元素的值会更好。

首先在您的视图模型中添加一个observable(我假设Model是您的视图模型,我将按照您的pascal案例):

Model.SelectedProduct = ko.observable();

然后将observable绑定到select元素:

<select data-bind="options: Model.Products, optionsText: 'Name', value: Model.SelectedProduct"></select>

你可以订阅observable,它会在observable改变值时执行你的函数:

Model.SelectedProduct.subscribe(function(product) {
    Model.TestFunction(product.Id);
});

之所以这样做更好,是因为在MVVM中,您希望在视图模型中保留尽可能多的逻辑,以便视图专注于演示。这是一个令人担忧的分离。

例如,在更改所选产品时,如果要确保执行Model.TestFunction,则以这种方式执行此操作可确保无论视图中发生了什么。如果将此逻辑移至视图中,您将面临潜在的错误,并增加所选产品更改时支持所有情况所需的复杂性和工作量。此外,您需要记住添加这个额外的逻辑,当您忘记这样做时会产生错误。