Knockoutjs 自定义绑定在项目完全渲染之前执行

2024-03-31

我正在尝试对项目列表执行回调以使用数据表 http://datatables.net/。现在我想在渲染所有项目之后执行回调,而不是在渲染每个项目之后执行回调。跟随那个所以问题 https://stackoverflow.com/questions/17552042/knockoutjs-execute-callback-after-foreach-finishes-rendering我创建了简单的自定义绑定

ko.bindingHandlers.ConvertToDataTable = {
    update: function (element, valueAccessor, allBindings) {
        var list = ko.utils.unwrapObservable(valueAccessor()); //grab a dependency to the obs array        
        var tableId = allBindings().tableId;
        $('#' + tableId).dataTable({
            "sDom": "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>"
        });
    }
}

我的看法是:

<table class="table table-striped table-bordered" data-bind="attr: { id: tableId }">
    <thead>
        <tr>
            <td>Task Name</td>
            <td>Task Description</td>
        </tr>
    </thead>
    <tbody>
        <!-- ko foreach: tasks, ConvertToDataTable: tasks, tableId: tableId -->
        <tr>
            <td data-bind="text: Name"></td>
            <td data-bind="text: Details"></td>
        </tr>
        <!-- /ko -->
    </tbody>
</table>

该代码工作正常,但项目数量较少。但如果有大量记录(例如 500 条),自定义绑定会在我的项目完全呈现之前执行。有什么想法吗?

Update
我通过 AJAX 从服务器获取数据,所以也许我的自定义绑定首先执行,而我的可观察数组items是空的


从逻辑的角度来看,不应该ConvertToDataTable绑定在桌子本身上,而不是在foreach?

另外,您不应该通过绑定或视图模型来控制表布局吗?自定义绑定对于硬编码值来说是一个非常糟糕的地方。

Anyway, controlsDescendantBindings是你的朋友 (docs http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html):

自定义绑定:

ko.bindingHandlers.dataTable = {
    init: function () {
        return { controlsDescendantBindings: true };
    },
    update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var layout = valueAccessor();

        ko.applyBindingsToDescendants(bindingContext, element);
        $(element).dataTable({ "sDom": layout });
    }
};

查看型号:

{
    dataTableLayout: "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
    tasks: ko.observableArray([/* ... */])
}

模板:

<table data-bind="dataTable: dataTableLayout">
    <thead>
        <tr>
            <td>Task Name</td>
            <td>Task Description</td>
        </tr>
    </thead>
    <tbody data-bind="foreach: tasks">
        <tr>
            <td data-bind="text: Name"></td>
            <td data-bind="text: Details"></td>
        </tr>
    </tbody>
</table>

http://jsfiddle.net/WcaM5/ http://jsfiddle.net/WcaM5/

免责声明:我不知道 jQuery DataTables 到底是如何工作的,所以示例是aircode。我想说的是,如果有必要,您可以手动控制绑定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Knockoutjs 自定义绑定在项目完全渲染之前执行 的相关文章

  • FOREACH返回的对象顺序稳定吗?

    是否可以安全地假设对同一集合的两次迭代将以相同的顺序返回对象 显然 假设集合没有被更改 这取决于集合类型 对于大多数集合来说 答案是 是 然而 这并不能得到保证 集合类型的文档应该指定它是否这样做 但正如大多数人所做的那样 该细节通常被忽视
  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 如何在 foreach( ... , .packages="pkg") %dopar% 中指定 R 包的位置

    我的 包 安装在其他地方 我如何告诉 foreach 在哪里可以找到该包 foreach i 1 2 packages pkg dopar 这给我错误消息 worker initialization failed there is no p
  • 基于范围的 for 循环对性能有益吗?

    阅读 Stack Overflow 上有关 C 迭代器和性能 的各种问题后 我开始想知道是否for auto elem container 被编译器 扩展 成最好的版本 就像auto 编译器立即将其推断为正确的类型 因此永远不会更慢 有时甚
  • 为什么这个对象的“forEach 不是函数”?

    这可能真的很愚蠢 但我不明白为什么这不起作用 var a cat large a forEach function value key map console log value 未捕获的类型错误 a forEach 不是函数 http j
  • 在 foreach 循环中启动一个新线程

    我有一个对象列表 我想循环该列表并启动一个新线程 传入当前对象 我写了一个我认为应该这样做的例子 但它不起作用 具体来说 线程似乎在每次迭代中都被覆盖 但这对我来说并没有什么意义 因为我每次都会创建一个新的 Thread 对象 这是我写的测
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • WebDriver:更改事件未触发

    我有一个使用 KnockoutJS 的应用程序 我正在尝试编写一些测试表单的测试 如果您不了解 KnockoutJS 简单来说 它提供了从我的视图到我的数据模型的绑定 这意味着当我在输入字段中键入值时 我的基础对象会自动使用该输入字段值进行
  • 输入按键的淘汰赛事件绑定会导致奇怪的行为

    长话短说 我希望用户能够在输入元素上按 Enter 键 并调用我的视图模型中的某些方法 这是我的 html 输入
  • knockoutjs 在 foreach 绑定中单击绑定

    编辑 问题与绑定无关 而是与一个简单的 JavaScript 错误有关 我有一个关于 foreach 绑定中的单击绑定的问题 我有一个列表 其中的项目显示一个下拉框 用于从主数据中选择一个值 可以在该列表中添加和删除项目 用于删除项目的按钮
  • Knockout JS 中的多个扩展器不起作用

    刚刚在KO中找到了出路 所以请温柔一点 每个扩展器单独工作 但是当我链接它们时 第一个 重置 不会触发 JavaScript ko extenders reset function target var initialValue targe
  • 使用 foreach 进行复杂的多维关联数组处理

    我不得不再次问这个问题 抱歉 但我在尝试处理这个数组时遇到了问题 我尝试了几种不同的方法 但没有一个是正确的 这是数组 Array search gt Array response gt Array errors gt number of
  • 淘汰赛,内容可编辑(和降价)

    使用由 markdown 字符串支持的 Knockout 绑定处理程序并进行渲染 使用 markdown js 和内置的 html 绑定处理程序 工作正常 但尝试添加内容可编辑行为 并且在可观察值未在模糊时更新或仅使用删除了所有降价格式的文
  • BOOST_FOREACH 和 c++11 基于范围的循环之间的区别?

    之间的主要区别是什么BOOST FOREACH和基于 C 11 范围的循环 有没有特定的情况我想使用BOOST FOREACH而不是基于范围的循环 或者反之亦然 执行了一些测试后std vector充满了1 000 000int变量我发现B
  • 绑定大插入或更新的更有效方法?

    好的 我是绑定新手 这里有一些有效的代码 我从教程中学到了这种格式 但我想还有更有效的方法来做到这一点 在我的示例中 有 4 个名称 但实际上我将在我正在处理的项目中进行大量插入和更新 该项目将有 20 个左右的字段 我喜欢这种方法 因为它
  • 在淘汰赛应用程序中使用 setInterval 进行轮询实现?

    我正在尝试使用 setInterval 实现简单的轮询机制 我有一个视图模型如下 define knockout jquery function ko function ViewModel var self this setInterval
  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • C#的数组列表可以用来填充SSIS对象变量吗?

    我已在 C 脚本中填充了一个列表 并将其值分配给 SSIS 对象变量 然后 我使用该对象变量通过循环遍历 For every do 枚举器来执行一些 SQL 查询 我尝试通过 Foreach ado 枚举器执行此操作 但出现错误 X 变量不

随机推荐