2012-07-25 47 views
0

我正在構建一個應用程序,在該應用程序中,我在後端使用Django並使用jQuery UI/Backbone構建前端。我將一個Django生成的表單放入一個帶有Backbone View內部的jQuery.get()的頁面中。這部分工作正常,但現在我想添加一些jQuery UI的東西的形式(例如日期選擇器,一些按鈕,打開對話框等)。因此,下面是相關的代碼:Backbone View中的jQuery UI添加元素,但不響應事件

var InstructionForm = Backbone.View.extend({ 
    render: function() { 
    var that = this; 
    $.get(
     '/tlstats/instruction/new/', 
     function(data) { 
     var elements = $(data); 
     $('#id_date', elements).datepicker(); 
     that.$el.html(elements.html()); 
     } 
    }; 
    return this; 
    } 
}); 

path/tlstats/instruction/new /返回一個帶有Django已經生成的表單的HTML片段。發生了什麼事是輸入#id_date正在增加hasDatePicker類,並且datepicker div被追加到我的<正文>元素(兩者都如預期),但是當我點擊輸入#id_date時,什麼都不會發生。沒有日期選擇器小部件出現,控制檯中沒有錯誤。爲什麼會發生這種情況?

不過有點偏離主題,但在試圖弄清楚這個問題了我自己,我遇到的幾個代碼示例,人們正在做的東西,如:

$(function() { 
    $('#dialog').dialog(...); 
    ... 
}); 

再後來:

var MyView = Backbone.View.extend({ 
    initialize(): function() { 
    this.el = $('#dialog'); 
    } 
}); 

這不是破壞Backbone的目的,讓所有的jQuery UI代碼完全在任何Backbone結構之外?還是我誤解了骨幹的作用?

謝謝。

回答

1

我認爲你的問題就在這裏:

$('#id_date', elements).datepicker(); 
that.$el.html(elements.html()); 

首先你綁定的日期選擇器與.datepicker(),然後你通過轉換您的elements爲HTML串放棄一切:

that.$el.html(elements.html()); 

和你將該字符串放入$el。當你說e.html()時,你正在接受一個帶有事件綁定和其他所有東西的包裝DOM對象,並且變成一個簡單的HTML字符串,這個過程拋棄了一切不是簡單的HTML的東西(比如事件綁定)。

要麼給.html() jQuery對象本身:

$('#id_date', elements).datepicker(); 
that.$el.html(elements); 

或日期選擇器添加HTML後綁定:

that.$el.html(elements); 
that.$('#id_date').datepicker(); 
+0

這個工作。謝謝! – mmccollow 2012-07-25 19:46:56

+1

有沒有人有一個想法如何重新放置已經有綁定的視圖?模型狀態改變時,重新渲染很重要。 – mojovski 2013-06-26 06:17:04

+1

@mojovski:也許你應該問一個新問題,那會讓你提供更多的背景,而不是對一年前的評論。 – 2013-06-26 06:28:26