0

当我看到我的淘汰赛页面的一些结果时,我正在写一个演示,我很震惊。这是结果: 在此处输入图像描述

我所做的很简单,当有人要求加载数据时,我会执行以下操作:

            self.items = ko.observableArray([]);
            self.colors = ko.observableArray([]);
            self.productModels = ko.observableArray([]);

            self.loadData = function() {
            var buffer;

            $.getJSON('/Product/InventoryData')
                .success(function(allData) {
                    buffer = [];
                    buffer = $.map(allData, function(item) { return new SDF.Data.DTO.ProductDto(item); });
                    self.items(buffer);
                })
                .error(function() {
                    alert("error on load data");
                });

            $.getJSON('/Product/GetColors')
                .success(function(allData) {
                    buffer = [];
                    ko.utils.arrayForEach(allData, function (item) {
                        buffer.push(item);
                    });
                    self.colors(buffer);
                })
                .error(function () {
                    alert("error on load colors");
                });

            $.getJSON('/Product/GetProductModels')
                .success(function (allData) {
                    buffer = [];
                    ko.utils.arrayForEach(allData, function (item) {
                        buffer.push(item.Name);
                    });
                    self.productModels(buffer);
                })
                .error(function () {
                    alert("error on load product models");
                });
        };

所有服务器方法的结果都被缓存,而且速度非常快。颜色和产品模型也是可观察的,因为我想让用户能够更改每个打印项目的产品“颜色”或“模型”。我加载的数据量只有 100 项。

按照我的html:

        <tbody data-bind="foreach: items">
        <tr>
            <td>
                <input type="text" data-bind="value: name" />
            </td>
            <td>
                <select data-bind="options: $root.colors, optionsCaption: 'Choose...'">
                </select>
            </td>
            <td>
                <input type="number" data-bind="value: price" />
            </td>
            <td>
                <select data-bind="options: $root.productModels, optionsCaption: 'Choose...'">
                </select>
            </td>
            <td>
                <label data-bind="text: qty">
                </label>
            </td>
            <td>
                <a href="#" id="product-sell">Sell</a>
            </td>
            <td>
                <a href="#" id="product-edit"></a>
            </td>
        </tr>
    </tbody>

除了“page it”之外的任何建议都值得赞赏。

更新 1

我发现这是问题所在,但现在我不知道如何解决它。问题是我如何编写每个项目的选择。可能有 repaint foreach 项目。怎么能避免呢?

更新 2

我发现的最佳解决方案是在我的标记中使用 Knockoutjs If-binding:http: //knockoutjs.com/documentation/if-binding.html

4

1 回答 1

0

你有没有在任何地方在线获得这个,或者你可以为此拼凑一个快速的jsfiddle,因为它真的不应该花那么长时间!

话虽如此,您为什么要遍历 AJAX 调用的结果并将值放入数组中?

您是否尝试过只进行一次 AJAX 调用并查看它对时间的影响?这是您页面上的大部分 html,还是还有更多?我很想知道是否是数据绑定导致样式计算和布局时间如此之大,因为它确实不应该如此。

于 2013-01-28T12:01:48.807 回答