绑定knockoutjs时jquery更改触发

时间:2013-01-09 08:18:06

标签: jquery knockout.js

如果我有我的模特

function SearchModel() {
        this.SearchCriteria = "";        
    }

并且在我的代码中有:

model.SearchCriteria = data;

ko.applyBindings(model);

然后在我的html中:

 <select id="vehiclesMake" data-bind="options: SearchCriteria.Tool.VehicleMakes, optionsText: 'Description', value: SearchCriteria.Tool.SelectedModel, optionsCaption: 'Choose...'"></select>     

所有这些都很好。我的下拉列表按预期填充。

现在我遇到的问题是我添加:

$('#vehiclesMake').change(function () {            
      loadSearchTool();                            
  });

loadSearchTool()执行的操作:

loadSearchTool = function () {
        var postCode = $('#postcode').val();
        var distance = $('#distance').val();
        var make = $('#vehiclesMake').val();
        var makemodel = $('#makemodel').val();
        var minPrice = $('#minPrice').val();
        var maxPrice = $('#maxPrice').val();

        data.getQuickSearch(postCode, distance, make, makemodel, minPrice, maxPrice, function (data) {
            //our success function                
            console.log(data.Result);           
            if (data.Result == 'Fail') {
                console.log('Fail');//TO DO
            }
            else {
                model.SearchCriteria = data;

                ko.applyBindings(model);
            }

        }, function () {            
            console.log('error');//TO DO
        });
    };

使用上面的所有代码,当loadsearchtool(也称为pageload)绑定到下拉列表时,.change()代码会被触发,我最终会进入无限循环。

我该如何解决这个问题?这是我在knockoutjs的第一次破解,所以我有点新手。

1 个答案:

答案 0 :(得分:1)

您只需将ko.applyBindings(model);移到loadSearchTool()之外。 ko.applyBindings只应调用一次(例如从$(document).ready()开始)。

您可能还想将SearchCriteria更改为observable:

this.SearchCriteria = ko.observable("");

更新数据使用:

model.SearchCriteria(data);