Knockout.js与可写计算属性绑定

时间:2013-02-22 16:20:02

标签: knockout.js

html :(生成我的knockoutmvc)

<select class="span12" data-bind="options : VehicleManufacturers,optionsText : function(item) { return item.Name; },optionsCaption : 'Select Manufacturer...',value : VehicleManufacturer"
id="VehicleManufacturer">
    <option value="">Select Manufacturer...</option>
    <option value="">AUDI</option>
</select>
<span data-bind="with: VehicleManufacturer">
    <span data-bind="text: Name"></span>
</span>

脚本:

var viewModelJs = {
     "VehicleManufacturers": [{
         "Id": 5,
         "Name": "AUDI"
     }],
     "VehicleManufacturer": null
 };
 var viewModel = ko.mapping.fromJS(viewModelJs);
 ko.applyBindings(viewModel);

viewModel.VehicleManufacturer = ko.computed({
    read: function () {
        return viewModel.VehicleManufacturer;
    },
    write: function (manufacturer) {
        // Populate Model list routine
    },
    owner: viewModel
});

JsFiddle:http://jsfiddle.net/ryDjs/2/

我可能不会完全正确地进行绑定,我正在尝试实现的是按照this article下拉级联,这是使用上面的代码,除了"with: VehicleManufacturer"绑定,即未显示所选制造商的名称。

2 个答案:

答案 0 :(得分:3)

认为 computed在这里使用是错误的(你链接的文章是关闭的)。当您想要计算依赖于其他可观察属性的值时,通常会使用computed。您计算的read函数只返回计算本身。

我会重做这个以使用普通的observable并手动订阅对该observable的更改:

var viewModelJs = {
    "VehicleManufacturers": [{
        "Id": 5,
        "Name": "AUDI"
     }],
     "VehicleManufacturer": null
};
var viewModel = ko.mapping.fromJS(viewModelJs);
ko.applyBindings(viewModel);

viewModel.VehicleManufacturer.subscribe(function (manufacturer) {
    alert('dfdf'); 
});

示例: http://jsfiddle.net/ryDjs/7/

答案 1 :(得分:1)

this what you were trying to accomplish?小提琴被打破了,因为你没有引用ko.mapping

更新

Andrew是对的,你不应该使用computed来写值。 Computed应该是只读的。如果要从其他值派生值,请使用它们。

我有another fiddle here解决了你的问题。它使用computed,但您也可以使用subscribe