knockout.js /如何响应绑定下拉列表中的更改事件

时间:2012-01-23 21:12:09

标签: javascript knockout.js

页面加载会发生什么,它会调用服务器以获取有关订单的信息(此时它只是一个可能的订单类型列表和当前订单类型的ID)。加载后,select的值应该设置为“selected_order_type”。

然而,看起来它只是在列表中选择它而不是实际将选择项的“值”设置为当前值。因此,例如在我的示例中,它在加载时选择第二个选项。如果我然后单击第三个选项一切正常,如果相反我点击第一个选项首先没有任何反应,我假设它,因为仍然有第一个选项值,即使它显示第二个选项作为选定的选项。 (非常新的淘汰赛已经使用它几个小时,只是试图了解它是如何工作的。)

<select id="order_type_select"
                    data-bind="options:order_types,
                      optionsText:'order_type',
                      optionsValue:'order_type_id',
                      value:selected_order_type"/>

function update_order_field(order_id,field,value){
    var url = '/op/update_order_field'
    data = {'order_id':order_id,'field':field,'value':value};
    console.log(url);
    console.log(data);
}

function refresh_order_data(order_id,view_model){
    $.getJSON("/op/order_json/"+order_id,function(data){
        ko.mapping.fromJS(data,view_model);
    });
    console.log(view_model.selected_order_type);
}

function OrderData(){
    var self = this;
    self.order_types = [{}]
    self.selected_order_type = '0'
    return self
}

$(document).ready(function() {
    var order_id = $("#order_id").attr('order_id');
    var view_model = ko.mapping.fromJS(new OrderData());
    view_model.selected_order_type.subscribe(function(data){
        console.log(data);
    });
    refresh_order_data(order_id,view_model);
    ko.applyBindings(view_model);
});

初始加载时来自服务器的数据......

{
    order_types: [
        { order_type_id=1, order_type="Phone"},
        { order_type_id=2, order_type="Fax"},
        {order_type_id=3, order_type="Web"}
    ],
    selected_order_type = '2' 
}   

1 个答案:

答案 0 :(得分:0)

问题是服务器端。虽然我不知道为什么客户端上的输出是相同的。我使用python将返回值包装在json.dumps中,一切都按预期工作