2012-10-09 41 views
0

我有2個與DOM事件有關的問題。無法趕上我的活動

我想在其上觸發DOM事件,我寫了這個代碼:

window.homeView = Backbone.View.extend({ 
    el : $('#home-container'), 

    initialize : function() { 
     this.template = _.template($('#home-template').html()); 
     this.render(); 
    }, 

    events: { 
     "click a.fb_connect": 'fetch_user' 
    }, 

    fetch_user: function(){ 
     console.log("Fetch requested..."); 
    }, 

    render : function() { 
     this.delegateEvents(); 
     var renderedContent = this.template(this.model.toJSON()); 
     $(this.el).html(renderedContent); 
     return this; 
    } 

}); 

,當我點擊我的鏈接<a class="fb_connect" href="#"><img src="img/fb-connect.png" alt="fb-connect" /></a>什麼happend ...我不知道爲什麼,任何想法?

另一個問題,我聽說「自定義事件」,我想在這裏做的是觸發我的Facebook登錄事件,所以在我的例子(這是行不通的),我打電話給我的事件點擊鏈接,但我應該在Facebook回調中調用事件以確保我獲得了數據,問題是,Facebook回調不是DOM事件,所以我不知道如何觸發它,是否有方法這些「自定義事件」做這種事情?

感謝您的幫助!

編輯:

+0

在控制檯中是否有任何錯誤? – tkone

+0

沒有任何事情發生,甚至沒有錯誤... – Ludo

+0

是模板的錨定標記部分? – tkone

回答

1

問題是你的鏈接不是由視圖定義的元素的一部分。

你有這樣的作爲模板:

<script type="text/template" id="home-template"> 
      <span><%= id %></span> 
      <span><%= username %></span> 
      <span><%= facebook_id %></span> 
      <span><%= facebook_token %></span> 
</script> 

這不包含元素,你要附加一個事件。

通過Backbone的事件哈希附加事件通過使用jQuery的on方法的委託能力工作,但由於它不知道(或想知道)你的模板何時實際連接到DOM(因此可訪問) ,但他們重視的骨幹創造的周邊元素,它,你的情況是由el : $('#home-container')

定義所以當骨幹重視的事件,它使用:

this.$el.on("click", "a.fb_connect", this.fetch_user); 

哪裏this.$el包裹el提供了jQuery (或0123由tagName,classNameid的組合生成的)。

由於<a class="fb_connect"...></a>不是<div id="home-container>孩子click事件永遠不會被解僱,因爲jQuery是隻監聽的錨標記上的點擊事件與類fb_connect這是div#home-container孩子。

如果你改變你的模板:

<script type="text/template" id="home-template"> 
      <span><%= id %></span> 
      <span><%= username %></span> 
      <span><%= facebook_id %></span> 
      <span><%= facebook_token %></span> 
      <a href="#" class="fb_connect">OK !</a>​ 
</script> 

它的工作原理。 (在小提琴確認)。

這裏是documentation for .on from jQuery這將有助於更詳細地解釋這一點。

和更新的jsfiddle

+0

好的,非常感謝你的解釋,很有道理! – Ludo

0

關於第一個問題,看看at this answer;你是否等待DOM準備好?

對於第二種情況,當您不能依賴骨幹視圖中的模型/收集事件時,我推薦使用pub/sub庫:this one有我的偏好。

+0

好的,我會看看你的圖書館。 是的,我推出的代碼是這樣的:'$(document).ready(function(){ App.home(); });' – Ludo

+0

爲什麼不在Backbone中使用事件聚合器?你不需要一個單獨的pub/sub庫;它包括在內。 – tkone

+0

聚合器被設計爲當對象彼此認識時(即,視圖知道要聽的模型/集合)工作。所以你不能按原樣使用,可以嗎? –