2017-08-11 161 views
0

我想運行一些代碼來調整我的頭完成渲染後的div的大小。我在這裏查看了答案和Backbone文檔。這是我寫的:骨幹視圖覆蓋渲染功能失去子視圖

Backbone.View.extend({ 
    template: header_tpl, 
    render: function() { 
     this.$el.html(this.template({}); 

     setTimeout(function() { 
      $(window).on("resize",function(){ 
       $(".somediv").height($(".someotherdiv").height()) 
      }) 
      .resize() 
     }, 0); 

     return this; 
    }, 
    childViews: { 
     // Some childViews in here 
    } 
}); 

這可以工作,但該視圖中的childViews不會呈現。我認爲它與在this.template()上傳遞的空對象有關。骨幹文檔說要傳遞this.model.attributes,但是這個視圖沒有模型。它是一個簡單的頭部,沒有數據被傳遞給它。

+0

這是一個Backbone.View或其他一些視角嗎?你可以展示更多你的代碼的視圖請 –

+0

其內部的Backbone.View.extend() –

+0

@CoryDanielson我添加了一些代碼 –

回答

1

正如@CoryDanielson的評論所指出的,Backbone沒有默認處理「childViews」。如果你的工作是使Backbone View呈現它的子視圖,那麼有很多簡單的方法可以做到這一點。

但我認爲你真正想要做的是保持某種預建的render功能,該功能在Backbone.View內嵌在代碼庫的其他地方。由於您需要的唯一擴展程序是將resize事件附加到window,所以最好的選擇是不要在render方法中執行此操作,那麼您可以繼續使用在代碼庫中其他位置預先構建的任何內容。

Backbone.View.extend({ 
    template: header_tpl, 
    // no override of render 
    initialize: function() { 
    setTimeout(function() { 
     $(window).on("resize",function(){ 
      $(".somediv").height($(".someotherdiv").height()) 
     }) 
     .resize() 
    }, 0); 
    }, 
    childViews: { 
    // Some childViews in here 
    } 
}); 

這段代碼應該在視圖實例化時附加事件,而不是在每個渲染器上。

當然,如果你的Codebase也可能改變了默認的initialize方法,我們真的不知道。在這種情況下,可能有一些選項可以通過擴展來覆蓋缺省方法(initialize,render,...),但仍然在引擎蓋下調用舊方法。

+0

我明白了。我正在開發由Netsuite爲SuiteCommerce Advanced管理的Backbone的實現。他們必須已經創建了這個自定義的childViews。我將嘗試在源代碼中找到它。 SCA非常龐大,我只能看到它的一部分。 –

+0

你是100%的權利。 SCA有一個主幹擴展模塊,它覆蓋了默認的Backbone.View.render –

+0

好的時候猜測平移:)你應該檢查他們是否也覆蓋'initialize'方法 - 如果他們這樣做,上述解決方案可能會打破別的東西。如果定製沒有留下任何適合調整大小的函數,可以使用一些很好的方法來覆蓋'render'(或其他),但仍然在override中調用默認值。讓我知道你是否需要任何想法... – arbuthnott