2011-10-14 221 views
14

我有一系列複選框,我想收集選定的複選框。該複選框是div的和被點擊div時複選框應該得到遏制,以及:當使用Jquery更改值時,KnockoutJS屬性不會更新

var oCheckBox = $($(this).find('.chkSocialMediaItem').get(0)); 
oCheckBox.attr('checked', !$(oCheckBox).attr('checked')); 

這工作得很好,但KnockoutJS不拿起變化等所選擇的不更新我的櫃檯項目。

我讀了你需要觸發改變事件的地方。但是,當我聽取複選框上的更改事件時,它確實會被觸發。

任何幫助,將不勝感激, 謝謝!

更新:

我已經找到了 '基因敲除' 的解決方案。 在我的div我做了一個數據綁定關「點擊」,並在該函數改變選中的值:

<script type="text/html" id="Template"> 
    <div class="item" data-bind="click: DivClicked"> 
     <input type="checkbox" data-bind="checked: IsASelectedItem" class="chkSocialMediaItem"/> 
    </div> 
</script> 


function SocialMediaSearchItem() {   
      this.IsASelectedItem = ko.observable(); 
      this.DivClicked = function() { 
       this.IsASelectedItem(!this.IsASelectedItem()); 
      }; 
} 

這是唯一的解決辦法?我真的很想看到一個Jquery解決方案。

回答

11

checked綁定僅偵聽click事件。手動觸發點擊事件最終會根據設置實際選中值的時間使框不同步。

設置該值的首選方法是更新您的視圖模型值,就像您在上面的第二個示例中所做的那樣。

但是,如果您使用的是1.3beta,則可以通過使用ko.dataFor API將元素與其相應的數據連接起來。它看起來是這樣的:

var oCheckBox = $('.chkSocialMediaItem'), 
     data = ko.dataFor(oCheckBox[0]); 
     data.selectedItem(!data.selectedItem()); 
+0

感謝您的快速響應!我會檢查測試星期一,當我回來@工作:) –

+0

哦,這是方便的,任何想法如何找出什麼'屬性'一個控件必須以及viewModel? –

+0

目前沒有辦法做到這一點,除了可能自己解析'data-bind'屬性,然後使用屬性名稱和數據('data ['somePropertyName']') –

12

我碰到了同樣的問題......雖然我沒有發現,我從一個張貼@RP尼邁耶工作不同的解決方案,所以我想我會張貼。

淘汰賽版本:1.2.1 - (敲除1.2.1.js)

要取消通過敲除結合的複選框我用下面

$('YourCheckBoxHere').removeAttr('checked'); 
$('YourCheckBoxHere').triggerHandler('click'); 

檢查通過敲除結合的複選框我曾經就這個問題下面

$('YourCheckBoxHere').attr('checked', 'true'); 
$('YourCheckBoxHere').triggerHandler('click'); 

希望,如果其他的解決方案沒有工作,這也許會=)...浪費了3個小時左右。

相關問題