knockout.js - 使用映射插件和KoGrid knockout 父子延迟加载

标签 knockout.js knockout-mapping-plugin knockout-2.0 kogrid

设置: 在我的 View 模型中,我有一个由 JSON 构建的可观察项目数组(它只有名称和 ID),称为“items”。我还有一个仅针对所选项目的可观察对象(它具有该项目的完整详细信息),称为“selecteditem”。当您单击“items”列表中的某个项目时,它应该填充“selecteditem”,这将通过另一个 JSON 回复用完整详细信息填充“itemdetails”,允许您编辑它们并保存更改。

进展: 网格的单击工作正常,如果我单击供应商 14,它会获取正确的 VendorID 并将其作为/api/vendor/14 传递到查询字符串。

问题: 如何使用第二个 ajax 调用(当您单击其中一项时触发)更新 View 模型的选定项目部分。

KoGrid HTML:

             <div class="gridContainer">
                <div data-bind="koGrid: { 
                    data: items, 
                    autogenerateColumns: false,
                    isMultiSelect: false,
                    displaySelectionCheckbox: false,
                    selectedItem: selecteditem,
                    columnDefs: [
                        { field: 'VendorID', displayName: 'Vendor ID' },
                        { field: 'Name', displayName: 'Vendor Name' }
                    ]}">
                </div>
            </div>

子 HTML(现在只有几个字段用于测试):

            <div data-bind="foreach: itemdetails">
                <span data-bind="text: BusinessContactName"></span><br />
                <span data-bind="text: BusinessContactTitle"></span>
            </div>

Javascript:

     <script type="text/javascript">
        $(document).ready(function () {
            var API_URL = "/api/vendor/";

            $.ajax({
                type: 'GET',
                url: API_URL,
                dataType: 'json',
                success: function (data) {
                    /* View Model */
                    window.viewModel = {
                        items: ko.mapping.fromJS(data),
                        selecteditem: ko.observable(),
                        itemdetails: ko.observable()
                    };

                    /* Get Selected Item */
                    window.viewModel.selecteditem.subscribe(function (newValue) {
                        if (newValue) {
                            var param = newValue.VendorID();
                            $.ajax({
                                type: 'GET',
                                url: API_URL + param,
                                dataType: 'json',
                                success: function (data2) {
                                    //What to do here??
                                    window.viewModel.itemdetails = ko.mapping.fromJS(data2);
                                    //This shows the correct value
                                    alert(window.viewModel.itemdetails.BusinessContactName());
                                }
                            });
                        }
                    });

                    ko.applyBindings(viewModel);
                }
            });
        });
    </script>

最佳答案

您的 viewModels itemdetails 设置似乎不正确。

而不是 window.viewModel.itemdetails = ko.mapping.fromJS(data2);

使用 window.viewModel.itemdetails(ko.mapping.fromJS(data2));

关于knockout.js - 使用映射插件和KoGrid knockout 父子延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13462581/

相关文章:

javascript - Knockout Object Literals 不适用于谷歌地图?

javascript - KnockoutJS 捕获错误绑定(bind)

javascript - 基本 Knockout JS 映射到单个 JSON 对象

knockout.js - 每次 ajax 请求返回时, knockout 中的模型都会尝试再次映射。 View 未更新

knockout.js - Knockout isDirty 示例,使用映射插件中的动态 View 模块

knockout.js - 在 Knockout 中使用带有 bool 值的 attr 绑定(bind)

javascript - Breeze.js EntityManager 未检测到更改

javascript - Knockout 组件 - 不能多次应用绑定(bind)

knockout.js - 绑定(bind)时会触发 knockoutjs 选择更改事件

javascript - knockout : How to get default item from select option and pass as argument to another function when page loads?