【问题标题】:KnockoutJS not updating viewKnockoutJS 不更新视图
【发布时间】:2013-12-11 00:18:48
【问题描述】:

我在使用 Knockout 时遇到了一个问题,这似乎有点令人费解。

我有一个联系人列表,我想将其绑定到 UI (observableArray)。
但是我不需要每个项目本身都是可观察的,因为它们仅通过对话框更新,我不需要单独跟踪每个字段。

我有以下 jsFiddle 来演示我的问题:

http://jsfiddle.net/EsgGg/12/

var c = contacts()[0];
c.name="James";
contacts.splice( 0, 1, c ); 
// the contacts observableArray is now correct but the UI is unchanged

由于某种原因,拼接方法没有更新视图??

提前致谢。

我真的认为 Knockout 应该允许在 observables 上使用 trigger('change') 或其他一些方法来使这类事情变得更容易。

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    Knockout 对 observables 有一个更改触发器。它叫valueHasMutated()

    contacts.valueHasMutated();
    

    但事实上,如果屏幕上显示的每个值(并且可能会偶尔更改)都是您的视图模型中的实际可观察​​值,那么您的情况会更好。

    contacts()[0].name("James");  // done
    

    【讨论】:

    • 感谢您提供该方法的提示。映射每个字段的问题是使用 JSON 从服务器更新它们要困难得多。另外,如果它们永远不会单独更改,为什么还要监视这些值? 1. 打开编辑对话框(jQueryUI) 2. 将联系人值复制到对话框内的表单 3. 单击保存按钮时,将表单值读入 JS 对象 4. 替换联系人列表中的条目。 #4 的另一种方法是遍历每个 JS 属性并在每次调用页面上的渲染时调用 observable。
    • 这就是 the mapping plugin 的创建目的。只需很少的努力,它就可以完成您想要的所有映射。如果您对其进行配置,它甚至只能映射一半的 JSON。如果您想更新服务器,它还负责取消映射所有内容。
    • 你在关于映射插件的评论中击败了我。 @DavidMedlock,您不需要在评论中的第 2 步中观察到这些属性吗?如果属性不可观察,knockout 如何知道表单文本框中的值已更改,并相应地更新视图模型中的属性?
    • Tomalak:感谢您对 ko.mapping 的关注。 @danludwig:我当然可以在每次打开对话框时使用 ko.applyBindings 对对话框进行绑定(难道我还必须调用 resetAll 吗??当对话框关闭时?)。现在您遇到了“取消”按钮的问题。因为我将视图(DOM)中的值与我的视图模型中的值绑定(不必要的 imo),所以我必须破解对话框的事务性质。
    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2011-11-06
    • 2019-01-26
    相关资源
    最近更新 更多