几个月前我开始使用淘汰赛,到目前为止,这是一条非常好的道路。今天当我在我的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:我必须把它们放?”
答案 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
可以解决我的问题。