【问题标题】:knockout performance - can you bind properties if your objects are not observable?淘汰赛性能 - 如果您的对象不可观察,您可以绑定属性吗?
【发布时间】:2012-05-31 07:09:24
【问题描述】:

我们有一个通过模板映射的大型嵌套 observable 数组来创建树视图。该列表是动态的,但树中可能有 1000 多个元素。

我们在加载和搜索此集合时遇到性能问题 - 在 IE8 和 iPad 中最为明显。 Chrome 看起来不错。

集合中的元素实际上并没有改变,所以我认为我们不需要可观察对象的“通知”方面,但我们想利用数据绑定。

有没有办法对视图模型中不可观察的对象进行数据绑定? 有没有办法在不使用 ko.mapping.fromJS() 的情况下创建不可观察的复杂数据集合?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    您可以完全绑定不变且不可观察的属性。似乎您只想以与映射插件相同的方式将一个大对象映射到另一个对象,但不创建可观察对象。您是否考虑过简单地使用JQuery.extend

    如果您的数组是可观察的,那么请确保您遵循this excellent post 中的指南。

    我还听说有人通过从原生模板切换到第三方(如 jquery.tmpl)来获得更好的性能(不确定这是否适用于您)。

    编辑

    在 cmets 进一步澄清后。问题是您的绑定假设属性是可观察的。在您的模板中,您有以下行。

     <!-- ko if: IsSectionHeader() --> 
    

    这是执行可观察的IsSectionHeader 以获得它的价值。当 IsSectionHeader 是 observable 时这很好,因为 observable are 函数。当您切换到原始模型时,这将不起作用。推荐使用firebug之类的工具,检查错误控制台,它准确地报告了错误。

    无论如何,解决方法是删除双括号。请注意,即使属性是可观察的,ko 绑定也可以使用带或不带括号的可观察对象,因此无论如何都不需要它们。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的意见。与其说我们想要将一个对象映射到另一个对象,不如说我们想要访问该对象以将属性绑定到呈现树的模板。
    • @Beth - 我很困惑你的问题是什么? “我们想要访问对象以进行绑定”是什么意思?如果您创建一个具有不可观察属性的普通旧 js 对象并使用单向 KO 绑定(如文本),它就可以正常工作。
    • 在当前的实现中,我们从代码隐藏变量中获取数据以将其拉入 aspx。当我们使用映射插件将它添加到视图模型时,例如viewModel.vmAvailablePages = ko.mapping.fromJS(dataAvailablePages); - 一切都很好。但是如果我们删除映射包装器,例如viewModel.vmAvailablePages = dataAvailablePages - 然后我们得到绑定错误。
    • @Beth - 如果你模拟一个 jsfiddle 来演示这个问题,我可能会帮助你。您可以以此为起点。 jsfiddle.net/madcapnmckay/qYmvh
    • 非常感谢。我在调试版本中看到了错误 - 只是没有很好地解释它。
    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 2012-12-02
    • 2014-03-18
    • 2014-10-29
    • 2013-05-19
    • 2017-09-19
    • 2012-08-07
    • 2018-06-14
    相关资源
    最近更新 更多