ノックアウトページの結果を見たとき、私はデモを書いていて、ショックを受けました。結果は次のとおりです。
私がしていることは非常に簡単です。誰かがデータをロードするように頼んだとき、私は次のことを行います:
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");
});
};
サーバーメソッドの結果はすべてキャッシュされ、非常に高速です。各印刷アイテムの製品の「色」または「モデル」を変更する機能をユーザーに提供したいので、色と ProductModels も観察可能です。ロードするデータの量はわずか 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
どちらが問題であるかはわかりましたが、どうすれば解決できるかわかりません。問題は、selects foreach Item の書き方です。おそらく各アイテムの再描画があります。どうすればそれを回避できますか?
更新 2
私が見つけた最善の解決策は、マークアップで Knockoutjs If-binding を使用することです: http://knockoutjs.com/documentation/if-binding.html