2014-02-23 88 views
2

所以我在這裏有兩個看法,他們的結構依賴於$(window).height()。所以當我重新調整瀏覽器的大小或者控制檯時,我需要計算高度。下面的作品適合我,但我沒有看到任何人提到這樣做。重新渲染調整大小的backbone.js視圖?

所以我想知道這段代碼是否可怕或好或很好。很顯然,我所做的只是告訴我的程序何時實例化我的觀點。

// Play 
$(document).ready(function() { 
    intro = new App.Views.Intro(); 
    flight = new App.Views.Flight(); 
}); 
$(window).on('resize', function() { 
    intro = new App.Views.Intro(); 
    flight = new App.Views.Flight(); 
}); 

不知道這是否符合指導原則,但我不希望這會在以後再回來傷害我。

編輯:不知道爲什麼我沒有想到這一點,但下面看起來很實用。我不想在視圖中重新渲染的原因是因爲它似乎必須添加一個remove()方法並「調整」調整大小。如果你問我,不是很漂亮和有組織。示例How do I add a resize event to the window in a view using Backbone?

// Play 
$(document).ready(function() { 
    intro = new App.Views.Intro(); 
    flight = new App.Views.Flight(); 
}); 
$(window).on('resize', function() { 
    intro.render(); 
    flight.render();  
}); 
+1

在視圖中是否有'.render()'方法可以調用?如果他們做了額外的事情,也許你可以將特定於格式的代碼重構成'.layout()'函數或其他東西,然後只需從你的resize處理程序調用它。 – voithos

+0

是的,我有'.render()'方法,我在'initialize()'方法中調用'this.render()',然後在'render()'裏面說'this。$ el.height $(window).height())'或者添加一個css屬性。所以通過重新實例化重新大小,我重新渲染。我只是想建立一個偉大的事情,不希望壞習慣在身邊。 –

+0

因此,而不是重新實例化它,你說的做'intro.layout()' –

回答

2

您可以創建一個基本視圖類來封裝此行爲。這可能有一些原因。一個好處是你可以將resize行爲從render代碼中分離出來。有時render確實做了很多工作,比如序列化模型和重寫dom的大部分內容,這些不需要重新運行。

這裏is a pen demonstrating a pattern我已經使用過,所以在初始渲染之後,只調整寬度/高度,並且不需要重新渲染任何視圖來調整它們的大小。代碼複製如下以方便。

這只是一個例子。在一個真正的應用程序中,我可能會調整幾個視圖,我通常會重構window.resize事件,所以我只連接一個偵聽器。

var ResizeView = Backbone.View.extend({ 
    template: '#view-tpl', 

    initialize: function() { 
    $(window).on('resize.resizeview', this.onResize.bind(this)); 
    }, 

    remove: function() { 
    $(window).off('resize.resizeview'); 
    Backbone.View.prototype.remove.call(this); 
    }, 

    render: function() { 
    var $tmpl = $(this.template); 
    var tmpl = _.template($tmpl.html()); 
    this.$el.append(tmpl()); 
    this.onResize(); 
    return this; 
    }, 

    onResize: function() { 
    var w = $(window).width() 
     , h = $(window).height(); 
    console.log('resize', w, h); 
    this.resize(w, h); 
    }, 

    resize: function (w, h) { 
    this.$el.css({ 
     'width': w, 
     'height': h 
    }); 
    } 
}); 

var view = new ResizeView(); 
$('body').append(view.render().$el); 
+0

非常感謝您抽出時間,我必須保存這些內容,因爲隨着代碼變得更加複雜,或者我應該說在代碼中添加更多內容時,我相信這會派上用場。根據我所讀的內容,是的,這是做到這一點的正確方法,但現在它超出了我的想象。好的片段恢復到儘管謝謝。 –

+0

綠色檢查,因爲這是正確的方式來做到這一點,我不親自使用它,如果有人遇到這個問題,那麼這是一個很好的答案。 –