2

几个月前我开始使用淘汰赛,到目前为止,这是一条非常好的道路。今天,当我在我的 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>

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

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

4

2 回答 2

4

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

当你使用括号时,你评估observable(这只是一个特殊的函数),这会导致一个破坏实时”数据绑定的值:在这种情况下,底层比如字符串)是绑定的,但不是observable从中获得值。

底层绑定(通常)足够聪明,可以处理可观察值和不可观察值。但是 bindings只能更新 observables,只能通过 observables 检测 Model 的变化。

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

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


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

于 2013-10-04T01:01:37.340 回答
0

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

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

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

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

于 2014-01-30T09:49:12.397 回答