我有一个包含 100 多个项目列表的表格,每个项目都有 3 个下拉列表,其中包含 100 多个项目的列表。
当用户单击从 MVC 应用程序获取 json 数据的搜索按钮时,我正在使用以下方法动态激活绑定。
问题是 IE8 的渲染时间是 Chrome 渲染的 20 倍。
我在我的代码中遵循了以下 ko 提示:
- 在底层数组上使用 valueHasMutated 以减少可观察到的命中
- 使用需要显示的单个项目加载下拉列表,并且仅当用户将鼠标悬停在下拉列表中加载所需的所有项目
select
- 正确处理 jquery
on
事件
我必须以 IE8 为目标,因为它是一个 Intranet 应用程序并继续使用 KO,因为我的应用程序因 IE8 和 KO 性能而存在问题。
cshtml
代码:
...在一个 html 表格中,我有下面的 td 用于显示下拉菜单。
<td>
<span data-bind="attr: { id: 'type-ddpl-holder-' + RowUniqueNo() }">
<select data-ddpl-loaded="false" class="type-ddpl">
<option data-bind="html: TypeName() ? TypeName() : '--Please select--''" selected></option>
</select>
</span>
</td>
...
RowUniqueNo()
我需要将 select 替换为ko template
具有唯一dom
元素 id 的绑定。
目的是不使用 ko 选项绑定,使用 json 中的项目加载下拉列表,即仅包含一项的下拉列表。
下面的 ko 代码在 ajax 成功处理程序中,它呈现上面的模板。
ko.applyBindingsToNode(document.getElementById('place-holder'),
{ template: { name: 'def-edit-tmpl', data: vm} });
onDdpl();
var element = document.getElementById('place-holder');
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
offDdpl();
});
- onDdpl 函数将挂钩到
on
'hover' 事件的 jquery 事件,这将使用绑定替换初始绑定select
控件与 ko 模板options
绑定。 - offDdpl 函数将用于处理
on
事件。
以下是on
活动中使用的模板
<script type="text/html" id="type-ddpl-tmpl">
<select class="fl tb120w" data-ddpl-loaded="true" data-bind="options: $parent.typeList, optionsText: 'Value', optionsValue:'Key', value:$data.TypeId">
</select>
对于使用这种方法渲染 100 个项目,IE8 需要 10 多秒,而 Chrome 需要不到一秒。在 10 多秒内,IE8 没有响应。非常感谢任何提高性能的帮助/提示。