2013-10-04 68 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解決我的問題。