Knockout.js 使用多个视图模型构建带淘汰的搜索功能

Knockout.js 使用多个视图模型构建带淘汰的搜索功能,knockout.js,Knockout.js,我的搜索功能有两个视图模型,第一个视图模型包含两个可观察的,搜索字符串和搜索类型。第二个视图模型是基于搜索的结果。在我的Ajax文章中,我使用搜索类型和搜索字符串作为变量来获得所需的结果。但是我得到了以下错误*未捕获错误:无法解析绑定。 消息:ReferenceError:未定义客户; 绑定值:foreach:Customers*由于Customers数组尚未初始化,因此我基于搜索按钮单击为第二个视图模型应用绑定。 下面是一个更好地解释我想做什么的例子 以下是我完整的javascript代码段:

我的搜索功能有两个视图模型,第一个视图模型包含两个可观察的,搜索字符串和搜索类型。第二个视图模型是基于搜索的结果。在我的Ajax文章中,我使用搜索类型和搜索字符串作为变量来获得所需的结果。但是我得到了以下错误*未捕获错误:无法解析绑定。 消息:ReferenceError:未定义客户; 绑定值:foreach:Customers*由于Customers数组尚未初始化,因此我基于搜索按钮单击为第二个视图模型应用绑定。 下面是一个更好地解释我想做什么的例子

以下是我完整的javascript代码段:

  var CustomerSearchViewModel = {
        SearchType: ko.observable(""),
        SearchString: ko.observable(""),
        setSearchType: function (data, element) {
            this.SearchType($(element.target).val());
        }
    }

    var CustomerSearhResultViewModelDS = function (data) {
        var self = this;
        self.CustomerID = ko.observable(data.CustomerID);
        alert(self.CustomerID);
        self.CustomerName = ko.observable(data.CustomerName);
        self.CustomerEMail = ko.observable(data.CustomerEMail);
        self.CustomerTelephone = ko.observable(data.CustomerTelephone);
        self.CustomerCompanyName = ko.observable(data.CustomerCompanyName);
        self.CustomerCompanyAddress1 = ko.observable(data.CustomerCompanyAddress1);
        self.CustomerCompanyAddress2 = ko.observable(data.CustomerCompanyAddress2);
        self.CustomerCompanyZipCode = ko.observable(data.CustomerCompanyZipCode);
    }


    var CustomerSearhResultViewModel = function (Customer) {
        var self = this;

        self.Customers = ko.observableArray(Customer);

        $.ajax({
            url: "/Services/DataServicesECOM.svc/CustomerSearch",
            data: { SearchType: CustomerSearchViewModel.SearchType(), SearchString: CustomerSearchViewModel.SearchString() },
            type: "GET",
            contentType: "application/json; charset=utf-8",
            dataType: "JSON",
            timeout: 10000,
            success: function (Result) {
                var MappedCustomer =
              $.map(Result.d,
             function (item) {
                 return new CustomerSearhResultViewModelDS(item);
             }
               );
             self.Customers(MappedCustomer);
                $('#ModalDetail').modal('show');
            },
            error: function (xhr, status) {
                alert(status + " - " + xhr.responseText);
            }
        });
    };

    function ActivateSearch() {
        var VM = new CustomerSearhResultViewModel();
        ko.applyBindings(VM);
    }

    $(document).ready(function () {
        ko.applyBindings(CustomerSearchViewModel);
    });

首先,您需要将每个视图模型绑定到页面的不同部分。请参阅以了解如何做到这一点

其次,您需要在页面加载时初始化一个空的搜索结果视图模型,并将其绑定到所需的页面部分,然后在获得结果后更新该视图模型


另一方面,当视图模型的属性与数据模型完全相同时,我宁愿使用手动复制数据的方法。

首先,您需要将每个视图模型绑定到页面的不同部分。请参阅以了解如何做到这一点

其次,您需要在页面加载时初始化一个空的搜索结果视图模型,并将其绑定到所需的页面部分,然后在获得结果后更新该视图模型


另外,当视图模型与数据模型具有完全相同的属性时,我宁愿使用手动复制数据。

您在这里有很多错误,您的问题不是很清楚。您甚至不能重新绑定同一个模型,您可以只更新或映射它。请更清楚地询问您想要什么以及您尝试调试的问题是什么?请参阅编辑,为了更好地解释,还添加了小提琴。为什么在两个不同的模型中执行此操作,而在一个模型中可以执行此操作?您在这里有许多错误,您的问题不是很清楚。您甚至不能重新绑定同一个模型,您可以只更新或映射它。请更清楚地询问您想要什么以及您尝试的问题是什么调试?请参阅编辑,添加了小提琴,以便更好地尝试和解释。当可以在一个模型中进行调试时,为什么要在两个不同的模型中进行调试?