data-bind:value - 括号 - 可观察

时间:2013-10-04 00:58:59

标签: html data-binding knockout.js

几个月前我开始使用淘汰赛,到目前为止,这是一条非常好的道路。今天当我在我的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属性末尾的括号()。由于这是一个可观察的,我认为括号是必要的,以便进行双向绑定。但是对于他们来说,每当我更改textarea的值时,viewmodel都不会相应更新,如果我删除了所有内容。

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

2 个答案:

答案 0 :(得分:4)

这是KO的神奇之处:特殊的“可观察”功能对象

当你使用括号时,你评估 observable(这只是一个特殊的函数),它会产生一个打破“直播“数据绑定:在这种情况下,底层的(比如一个字符串)是绑定的,但不是从中获取值的 observable

undershlying绑定(通常)足够聪明,可以处理observable和不可观察的值。但是,绑定只能 更新observable,并且只能通过observable 检测模型更改。

因此,通常,在使用带有声明性数据绑定的 obervables 时不要包含括号。

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


然而,在一些罕见的情况下,你只需要,而你永远不希望绑定更新从/到模型。在这些罕见的情况下,使用括号 - 强制值提取而不绑定可观察的本身 - 是正确的。

答案 1 :(得分:0)

就我而言,我使用jquery.tmpl

和knockout 2.2.0适用于jquery.tmpl,当我升级到淘汰赛3.0时,我遇到了这个问题

当我使用这个时,它以某种方式与Knockoutjs内置模板/

发生冲突

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