2012-09-08 18 views
0

模型中有一個'View',事件爲click。在爲jQuery使用Quicksand效果插件後,這些對象會釋放它們的事件處理程序。我試圖用標準方法Backbone.js的添加監聽事件:使用Quicksand後,Backbone.View中的'click'事件消失

events: { 
    "click .objContact" : "openChat" 
} 

和相同的工具jQuery的delegate

var self=this; 
this.$el.delegate('.objContact','click', function(){ 
    self.openChat(); 
}); 

live

var self=this; 
this.$el.find('.objContact').live('click', function(){ 
    self.openChat(); 
}); 

click事件消失。 可能是什麼問題?我該如何解決它?

UPD:調用 '流沙' 在Backbone.Router(直接由jQuery的,不骨幹來獲得受變化),因此更改不會在Backbone.View

UPD 2處理:通過以下方式解決問題 - 將click事件的處理從視圖模型移動到視圖集合。並與現場(在on沒有工作)

回答

1

處理做對delegateEvents()呼叫相關的DOM條目之後已經改變或變得覆蓋。在傳統的Backbone應用程序中,這通常是在render方法中完成的,但您可能需要確定流沙的時間和地點是否有魔力(我對此一無所知),並調用delegateEvents來重新激活當前元素的事件在DOM中。

+0

您可能需要['setElement'](http://backbonejs.org/#View-setElement)而不是'delegateEvents',具體取決於流沙對DOM的作用。 –

+0

在_QuickSand_中有這樣一行'var $ dest = $($ sourceParent).clone()'。但想法(和文檔)'.live'是爲新創建的項目創建一個事件,但沒有奏效。 –

+0

克隆只克隆一個元素,但不會將其插入到DOM AFAIK中。如何將它插入到DOM中可能會影響事件,甚至會影響附加到視圖本身的元素。從理論上講,用一個(據稱是唯一的)ID克隆和元素也可能是混淆的根源。 –

2

簡單的答案:不是的函數是

$('a.oldJqueryClass').click(function(){.... 

你需要做的是功能獨立,宣佈了新的功能

功能myfunction的經典AJAX方法鏈接到鏈接(PARAMS) {警報(PARAMS);}

比你調用的鏈接,與老同學的方式:

<a href="#" class="oldJqueryClass" onclick="javascript:myfunction('My alert message')">Click here</a> 

通過這種方式,克隆的元素將包含對函數的調用,並且您可以忘記恢復由克隆流沙所破壞的dom完整性。

我在我的項目中做到了,它工作正常。

+0

是的,這個選項也不錯。但就我而言,代碼是在Chrome的擴展中執行的,並且禁止引入新規則「Manifest 2」。 –