Html 数据绑定:值-括号-可观察

Html 数据绑定:值-括号-可观察,html,data-binding,knockout.js,Html,Data Binding,Knockout.js,几个月前,我开始与knockout合作,到目前为止,这是一条非常好的道路。今天,当我在html中处理一些输入时,我遇到了一个非常无聊的问题,我花了一段时间才弄明白。这是我的密码: <div class="add-box" style="display:none;" id="new-user"> <textarea placeholder="Name" data-bind="value : name"></textarea> </div> &

几个月前,我开始与knockout合作,到目前为止,这是一条非常好的道路。今天,当我在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>

函数UserViewModel(){
var self=这个;
self.name=ko.observable(“”);
}
$(文档).ready(函数(){
applyBindings(newuserviewmodel(),document.getElementById('new-user');
})
这段代码很好用,但我第一次这么做是这样的:

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

它们之间唯一的区别是name属性末尾的括号()。因为这是一个可观察的,所以我认为为了进行双向绑定,括号是必要的。但是有了它们,每当我更改textarea的值时,如果我删除所有内容,viewmodel就不会相应地更新


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

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

当您使用括号时,您计算可观测值(这只是一个特殊的函数),它会导致一个打破“活动”数据绑定的值:在这种情况下,绑定的是基础值(比如字符串),而不是从中获取值的可观测值

underylying绑定(通常)足够聪明,可以处理可观测值和不可观测值。然而,绑定只能更新可观测值,只能通过可观测值检测模型更改

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

传递observable将确保Magic正常工作,并允许视图和模型保持同步。对所述绑定observable的更改将触发适当的绑定更新(例如,使其能够更新HTML),即使绑定本身不需要更新observable/模型



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

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

当您使用括号时,您计算可观测值(这只是一个特殊的函数),它会导致一个打破“活动”数据绑定的值:在这种情况下,绑定的是基础值(比如字符串),而不是从中获取值的可观测值

underylying绑定(通常)足够聪明,可以处理可观测值和不可观测值。然而,绑定只能更新可观测值,只能通过可观测值检测模型更改

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

传递observable将确保Magic正常工作,并允许视图和模型保持同步。对所述绑定observable的更改将触发适当的绑定更新(例如,使其能够更新HTML),即使绑定本身不需要更新observable/模型



但是,在一些罕见的情况下,您只需要当时的值,而不希望绑定从模型更新到模型。在这些罕见的情况下,使用括号(强制提取值而不绑定可观察对象本身)是正确的。

在我的情况下,我使用的是
jquery.tmpl

knockout 2.2.0与jquery.tmpl一起使用,当我升级到knockout 3.0时,我遇到了这个问题

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


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

在我的例子中,我使用的是
jquery.tmpl

knockout 2.2.0与jquery.tmpl一起使用,当我升级到knockout 3.0时,我遇到了这个问题

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

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