2013-10-04 51 views
2

几个月前我开始与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> 

此代码工作正常,但我第一次做的是这样的:

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

它们之间唯一的区别是括号()在的结束名称属性。由于这是一个可观察的因素,我认为括号对于进行双向约束是必要的。但对他们来说,每当我改变textarea的值时,viewmodel都不会相应地更新,如果我删除所有的东西的话。

你能解释一下为什么在这种情况下,我不得不删除括号,为什么在其他场景中,就像我使用的数据绑定=“TEXT:我必须把他们??

回答

4

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

当您使用括号,你评估可观察到的(这仅仅是一个特殊的函数),这导致休息“活”。数据绑定:在这种情况下,底层(说,一个字符串)是绑定的,但不是可观察到从中获得值。

underylying绑定(通常)足够聪明来处理observable和non-observable值。但是,绑定可以只有更新observable和可以只有通过observables检测模型更改。

所以,通常,使用obervables与声明的数据绑定时不包括括号。

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


然而,在某些极少数情况下,你只想价值右侧则和你永远不希望结合从/示范更新。在这些罕见的情况下,使用括号 - 强制提取值而不绑定可观察值本身 - 是正确的。

+0

这里的解决方案是什么?为什么他在插入括号后没有工作? –

0

在我来说,我是用jquery.tmpl

和基因敲除2.2.0作品与jquery.tmpl,当我升级到淘汰赛3。0,我得到了这个问题

当我用这一个

,它以某种方式获得与Knockoutjs内置模板冲突/

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