2014-03-26 21 views
2

快速的問題,這是真的更感興趣。jQuery的onClick工作在div的約束由KnockoutJS

我有一個div,它使用Knockout JS在AJAX請求後綁定一堆數據。

<div data-bind="with: user" id="ActionWindow"> 
...Stuff... 
</div> 

這一切正常。

但是,如果我再要使用jQuery的onclick或事件的onChange我不能做這樣的:

<div data-bind="with: user" id="ActionWindow"> 
<a class="NewGroupLink">Add New Group</a> 
...Stuff... 
</div> 
<script> 
$('.NewGroupLink').click(function() { 
    alert('bob'); 
}); 
</script> 

事件只是不火。

我可以在「a」中放置一個onClick =「」,我期望這會起作用,但爲什麼這不起作用?

偶然上面的代碼工作正常,如果鏈接是在div之外。

有誰能告訴我爲什麼?如果有辦法讓jQuery代碼工作?

非常感謝。

回答

4

您的HTML代碼是否在有條件ififnot在淘汰賽中?由於它們的工作方式(它們實際上並沒有插入包含的DOM節點,除非它們的計算結果爲true),當您試圖掛鉤事件時,超鏈接實際上可能不在文檔中。

如果是這樣的話,我的建議是使用下面的代碼掛鉤的事件處理程序:

$('body').on('click', '.NewGroupLink', function() { 
    ... 
}); 

這樣一來,該事件實際上是附加到文檔的身體,但只有處理程序的代碼在事件發生在具有CSS類NewGroupLink的元素上的情況下執行。

如果你的頁面很大,如果你使用一個更接近實際鏈接,但仍然是祖先的不同元素(而不是body),代碼可能更精確/更好的執行。

+0

嗨。這工作,但我不知道我明白爲什麼。我沒有任何條件陳述。當一個按鈕被按下時頁面被綁定了....啊!我剛剛回答了我自己的問題。如果有數據,所有的文本框都是綁定的。 this.selectedItem =數據? data.JobTitleNum:「」;例如。 因此,儘管我的鏈接沒有數據綁定標籤,但它仍然不會在Dom上呈現。是對的嗎? –

+0

我相信你是正確的,因爲'with'綁定的行爲就像'if' /'ifnot'。 從文檔:*綁定將動態地添加或刪除後代元素取決於相關的值是否爲空/未定義或不* 因此,如果當您嘗試鉤住事件時'user'未定義/ null,按鈕將不在頁面上,所以'$('。NewGroupLink').length'將是0,並且不會將事件處理程序掛接到任何東西。 – UweB

2

如果您正在從您從ajax調用中檢索的數據創建目標元素,那麼您需要使用委託來定位點擊處理程序(點擊處理程序僅適用於在DOM中存在的元素時間處理程序開始運行。

$("#ActionWindow").on("click", ".NewGroupLink", function() { 
    alert($(this).text()); 
}); 
1

嘗試使用onsee jQuery docs

<div data-bind="with: user" id="ActionWindow"> 
<a href="#" class="NewGroupLink">Add New Group</a> 
...Stuff... 
</div> 
<script> 
$('.NewGroupLink').on('click', function() { 
    alert('bob'); 
}); 
</script> 
2

首先,它是一個不好的做法,使用jquery事件與淘汰賽。KO都有自己的事件,所以如果你想要添加點擊h andler公正處理函數到您的視圖模型,並添加點擊綁定的HTML元素:因爲查詢代碼DIV的內容呈現前執行

<a class="NewGroupLink" data-bind="click: onClickHandler">Add New Group</a> 

您的代碼不起作用。所以當它被稱爲鏈接不存在。發生這種情況是由於with綁定,它等到ko.applyBindings被調用,並且如果用戶不爲null,則呈現div。