0

如果我有我的模型

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 的第一次破解,所以对它有点新手。

4

1 回答 1

1

你只需要搬到ko.applyBindings(model);外面去loadSearchTool()。ko.applyBindings 应该只被调用一次($(document).ready()例如)。

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

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

要更新数据,请使用:

model.SearchCriteria(data);
于 2013-01-09T11:13:27.520 回答