【问题标题】:data-bind: value - parenthesis - observable数据绑定:值 - 括号 - 可观察
【发布时间】:2013-10-04 00:58:59
【问题描述】:

几个月前我开始使用淘汰赛,到目前为止,这是一条非常好的道路。今天,当我在我的 html 中处理一些输入时,我遇到了一个非常无聊的问题,我花了一段时间才弄清楚。这是我的代码:

<div class="add-box" style="display:none;" id="new-user">
   <textarea placeholder="Name" data-bind="value : name"></textarea>
</div>

<script>
    function UserViewModel() {
        var self = this;
        self.name= ko.observable('');
    }


    $(document).ready(function () {
        ko.applyBindings(new  UserViewModel(), document.getElementById('new-user'));
    })
</script>

这段代码运行良好,但我第一次这样做是这样的:

<textarea placeholder="Name" data-bind="value : name()"></textarea>

它们之间的唯一区别是 name 属性末尾的括号 ()。由于这是一个可观察的,我认为括号是必要的,以便进行 2-way-binding。但是有了它们,每当我更改 textarea 的值时,如果我删除一切正常,viewmodel 就不会相应地更新。

你能解释一下为什么在这种情况下我必须删除括号,以及为什么在其他情况下,比如当我使用 data-bind="text: 我必须把它们放上去??

【问题讨论】:

    标签: html data-binding knockout.js


    【解决方案1】:

    这是 KO 的魔力:特殊的“可观察”函数对象。

    当您使用括号时,您 评估 可观察对象(这只是一个特殊功能),它会产生一个 value breaks "live " 数据绑定:在这种情况下,底层的值(比如一个字符串)是绑定的,但不是从中获取值的observable。

    底层绑定(通常)足够聪明,可以处理可观察值和不可观察值。但是,绑定可以仅更新可观察对象,并且可以仅通过可观察对象检测模型更改。

    因此,通常,在将 obervables 与声明性数据绑定一起使用时不要包含括号。

    传递 observable 将确保 Magic Just Works 并允许 View 和 Model 保持同步。对上述绑定的 observable 的更改将触发适当的绑定更新(例如,以便它可以更新 HTML),即使绑定本身不需要更新 observable/Model。


    但是,在一些罕见的情况下,您只需要 正确的值,并且您从不希望绑定从/到更新模型。在这些罕见的情况下,使用括号 - 强制提取值而不绑定 observable 本身 - 是正确的。

    【讨论】:

      【解决方案2】:

      就我而言,我使用的是jquery.tmpl,

      并且淘汰赛 2.2.0 与 jquery.tmpl 一起使用,当我升级到淘汰赛 3.0 时,我遇到了这个问题

      当我使用这个时,它会与 Knockoutjs 内置模板发生冲突/

      删除 jquery.tmpl.js 解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-25
        • 2017-07-26
        • 2012-11-02
        • 2019-09-23
        • 2014-06-23
        • 2014-01-15
        • 2019-06-14
        • 1970-01-01
        相关资源
        最近更新 更多