我有一个页面(下面的相关代码),该页面执行以下操作:

  • 用户在自动完成的文本框中输入一个值
    2,选择自动完成选项后,进行ajax调用以填充2个下拉列表
  • 用户需要从每个下拉列表中选择一个值
  • 一旦在两者上都选择了一个值,他们就会单击添加按钮,并且我的绑定(bind)表将被更新
  • 用户可以删除添加到表
  • 中的行

    在步骤4中添加的行包含在可观察对象的数组中。
    页面第一次加载点1到5的工作是预期的.....

    但是,如果用户在自动完成框中输入新搜索并触发select事件,则第二次执行ajax调用时, View 模型和UI对象之间的关系就会中断。

    正在执行的代码是相同的,因此请有人可以阐明为什么第二次出现此中断。
    <input type="text" id="txtBox" style="width:300px;" />
    
    <div id="fixturesBindable" style="padding:0 !Important;">
    <table>
        <thead>
            <tr>
                            <th>Col1</th>
                            <th>Col2</th>
            </tr>
        </thead>
    
        <tbody data-template="row-template" data-bind="source: Fixtures"></tbody>
    </table>
    
    <select id="a_teamsdropdown" data-role="dropdownlist" data-text-field="TeamFullName" data-value-field="Id" data-bind="source: Teams" style="width:200px;"></select>
    <select id="a_oppteamsdropdown" data-role="dropdownlist" data-text-field="TeamFullName" data-value-field="Id" data-bind="source:
    OpponentTeams" style="width:200px;"></select>
    
    <button type="button" data-bind="click: addFixture">Add Fixture</button>
    
    <script id="row-template" type="text/x-kendo-template">
    <tr>
    <td><input type="hidden" id="team"  data-bind="attr: { name: TeamModelName, value: TeamId }" /></td>
    <td><input type="hidden" id="oppteam" data-bind="attr: { name: OppModelName, value: OppTeamId }" /></td>
    </tr>
    </script>
    
    </div>
    
    
    <script>
    $(document).ready(function () {
            var viewModel = kendo.observable({
                Teams: <%= Model.Teams %>,
                OpponentTeams: [],
                Fixtures: [],
                addFixture: function (e) {
                    var Fixtures = this.get("Fixtures");
                    var teamId = $("#a_teamsdropdown").val();
                    var teamName = $("#a_teamsdropdown>option:selected").text();
                    var oppteamId = $("#a_oppteamsdropdown").val();
                    var oppteamName = $("#a_oppteamsdropdown>option:selected").text();
    
                        this.get("Fixtures").push({
                            TeamFullName: teamName,
                            TeamId: teamId,
                            OppTeamFullName: oppteamName,
                            OppTeamId: oppteamId,
                            OrderIndex: this.get("Fixtures").length,
                            TeamModelName: 'Fixtures[' + this.get("Fixtures").length + '].TeamId',
                            OppModelName: 'Fixtures[' + this.get("Fixtures").length + '].OpponentTeamId'
                        });
                },
                resetFixture: function(){
                    var Fixtures = this.get("Fixtures");
                    $.each(Fixtures, function (key, fixture) {
                        Fixtures.splice(0, 1);
                    });
                }
            });
    
        opponents = $("#txtBox").kendoAutoComplete({
                minLength: 3,
                dataTextField: "Name",
                filter: "contains",
                dataSource: new kendo.data.DataSource({
                    transport: {
                        read: {
                            url: "/url/Ajax",
                            type: "POST",
                            data: function () { return { searchText: $("#txtBox").val()}
                            },
                            complete: function (data) {
                                opponents.list.width(400);
                            }
                        }
                    },
                    pageSize: 10,
                    serverPaging: true,
                    serverSorting: true,
                    schema: {
                        total: "count",
                        data: "data",
                        model: {
                            id: "Id",
                            fields: {
                                Id: { editable: false }
                            }
                        }
                    }
                }),
                change: function () {
                    this.dataSource.read();
                },
                select: function (e) {
                    $.each(opponents.dataSource.data(), function (index, value) {
                        if (e.item.text() == value.Name) {
                            selectedOpponent = value;
                            $('#Fixture_OpponentTeam_Id').val(selectedOpponent.Id);
                            $('#OpponentName').val(selectedOpponent.Name);
                            $.ajax({
                                url: 'GetOpponentTeams',
                                data: { schoolId: selectedOpponent.Id, seasonId: seasonId, sportId: sportsId },
                                type: 'GET',
                                success: function (data) {
                                    viewModel.OpponentTeams = data;
                                    kendo.bind($("#fixturesBindable"), viewModel);
                                },
                                error: function (xhr, ajaxOptions, thrownError) {
                                    //alert('Error during process: \n' + xhr.responseText);
                                    alert(thrownError);
                                }
                            });
                            return;
                        }
                    });
                }
    
            }).data("kendoAutoComplete");
    </script>
    

    最佳答案

    不知道这是否能解决您的问题,但总的来说,我建议您不要重新绑定(bind)ajax成功回调中的所有内容。如果您只是.set("OpponentTeams")而不是直接分配值,那有帮助吗?

    success: function (data) {
        viewModel.set("OpponentTeams", data);
    },
    

    调用.set()应该触发#a_oppteamsdropdown元素的刷新。

    关于mvvm - kendo mvvm在ajax调用后未更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14600319/

    10-09 23:42
    查看更多