2013-04-12 11 views
5

Ich bin an einige Ereignisse in der render Funktion von backbone.js binden, genauer gesagt eine click, aber ich kann es nicht zur Arbeit bekommen.backbone.js trigger events in render()

Ich habe ein ähnliches (aber sehr vereinfacht) Set-up zu:

App.ProductView = Backbone.View.extend({ 

className: 'title_products_tab', 
el: $('.title_products_tab'), 

events: { 
    'click .product_list .edit_product' : 'edit', 

Für die Ereignisse Abschnitt meiner Rückgrat Ansicht. Unten in der Render-Funktion Ich wünsche das gebundene .edit_productclick Ereignis auszulösen:

render: function(){ 
     console.log($._data($('.title_products_tab .product_list .edit_product')[0], "events")); 
     $('.title_products_tab .product_list .edit_product').trigger('click'); 

Welche nicht funktioniert, das _data für das Element ist nicht definiert, aber ich weiß, dass die Veranstaltung funktioniert, weil der Rest meiner Ansicht Funktionen entsprechend. Ich kann einfach nicht Ereignisse in render oder irgendwo anders beim Start auslösen.

Ich dachte:

this.trigger('click .product_list .edit_product'); 

aber funktionieren würde, wieder kein Glück.

Ich hörte auch über bindAll, aber ich hörte, dass es keine gute Idee war, dies zu verwenden.

Also, wie kann ich, oder besser wann, Startup-Ereignisse für meine Backbone-Ansicht auslösen?

+0

Wenn rufen Sie Ihre Methode machen? In der Initialisierungsmethode? – Loamhoof

+0

@Loamhoof Tatsächlich, in der init-Methode – Sammaye

Antwort

2

So können Sie diese interessant finden (Anmerkung: Backbone Code):

var View = Backbone.View = function(options) { 
    this.cid = _.uniqueId('view'); 
    this._configure(options || {}); 
    this._ensureElement(); 
    this.initialize.apply(this, arguments); 
    this.delegateEvents(); 
}; 

Vor allem der letzte Teil. Die Ereignisse sind gebunden nach die Initialisierungsmethode aufgerufen wird, also nachdem Ihre Rendermethode aufgerufen wird. Die Ereignisse sind noch nicht gebunden.

(Ich denke, man manuell delegateEvents nennen könnte, wenn man es wirklich die Art und Weise tun müssen, Sie tun)

+0

Gibt es keine anmutige Art und Weise von Backbone unterstützt? :( – Sammaye

+0

Nun, ich denke, Sie könnten einfach die Methode selbst nennen: 'this.edit()'. Ändern Sie eine Zeile Code für einen anderen, scheint nicht so ein schlechter Deal;) – Loamhoof

+0

Das ist eine gute Idee, obwohl es an eine Produktliste und wenn diese Liste 1 in der Größe ist, wähle ich den einzigen Eintrag für diese Liste für den Benutzer aus, was über interne Kodierung programmierbar wäre, wäre für mich nicht nett; Ich benutze derzeit Backbone als Mittel, um das Frontend eines bereits bestehenden Formulars zu standardisieren; Ach, ich werde nur den Delegierten tun, danke :) – Sammaye