2012-12-13 106 views
3

我似乎對下面的代碼有問題。我在我的html中有一個id ='content'的div元素。我想用div元素替換el屬性的'body'元素,但是當我輸入el時,我的hello world文本不會變成:$('div')或者el:$('div#content')或者el:$( '#內容')。我是backbone.js的初學者,根據我的理解,我相信這個el屬性擁有我們的父標籤,我們所有的模板都將作爲子元素添加(在這種情況下,'body'標籤是父代,'p'標籤是兒童)。不能夠將el元素附加到骨幹中的el元素。

(function($){ 
    var ListView = Backbone.View.extend({ 
    el: $('body'),  

    initialize: function(){ 
     this.render(); 
    }, 

    render: function(){ 
     (this.el).append("<p>Hello World</p>"); 
    } 
}); 

var listView = new ListView(); 
})(jQuery); 

回答

7

View.el屬性應該定義爲jQuery選擇器(字符串),而不是對HTML元素的引用。

Backbone documentation

var BodyView = Backbone.View.extend({ 
    el: 'body' 
}); 

或者你願意,

el:'div#content' 

當視圖初始化,骨幹引用了元素使其可通過view.$el屬性,它是一個高速緩存jQuery對象。

this.$el.append("<p>Hello World</p>"); 

的示例代碼您發佈的作品,因爲永遠只有一個body元素,該元素在您的視圖呈現在DOM已經存在。所以當你聲明el:$('body')時,你會得到對body元素的引用。在作品render的代碼,因爲this.el現在是一個直接引用jQuery對象:

(this.el).append("<p>Hello World</p>"); 

如果需要使用現有的DOM元素(不選擇)來初始化一個骨幹視圖,骨幹文檔推薦傳遞給initialize函數。

+0

有趣的是,我的代碼(用div標籤代替body標籤)在jsfiddle中工作,而不是在我的電腦中工作。最重要的是,當它選擇div標籤時,'this。$ el.'是'undefined'。 – jaykumarark

+0

@jaykumarark,你還沒有發佈jsfiddle的鏈接,但我最好的猜測是,在jsfiddle中,視圖是在body.onload事件處理器中定義的(DOM被加載後),因此元素已經存在。 – jevakallio

+0

http://jsfiddle.net/whcmU/4/那就是鏈接。似乎代碼不會在我的計算機中顯示我的div標記中的文本。 – jaykumarark