2014-11-23 58 views
0

在我的應用程序中,我有一些頁面具有類似的設計和主頁,設計完全不同。所以,我的問題是如何理解所需的佈局(對於具有類似設計的頁面)已經被創建,而不是重新渲染它。順便說一句,在進一步的發展中,我可能會添加一些新的頁面,將有不同的設計。我想過一些解決方案,但它們都對我來說似乎是反模式。所以,我需要以正確的方式組織我的Marionette.Controller。現在看起來像這樣:如何理解所需佈局已經創建?

define(['backbone', 'marionette', 'app/app', 'session'], function (Backbone, Marionette, app, session) { 

'use strict'; 

var main = app.mainRegion; 

function mainContent (view, model, options) { 

    require([view, model], function (View, Model) { 

     if (...) { //if main.currentView is already 'layout/main' then... 

      var model = new Model(options); 
      main.currentView.content.show(new View({ model: model })); 

     } else { 
      require(['layout/main'], function(Layout) { 

       main.show(new Layout()); 

       var model = new Model(options); 
       main.currentView.content.show(new View({ model: model })); 

      }) 
     } 
    }); 

} 

return Marionette.Controller.extend({ 

    home: function() { 
     if (session.getToken() === '') { 

      require(['layout/home', 'login/view', 'register/view', 'login/model', 
      'register/model'], function(Layout, LoginView, RegisterView, LoginModel, RegisterModel) { 

       main.show(new Layout()); 
       main.currentView.login.show(new LoginView({ model: new LoginModel() })); 
       main.currentView.register.show(new RegisterView({ model: new RegisterModel() })); 

      }); 

     } else { 
      Backbone.history.navigate('/feed', { trigger: true }); 
     } 
    }, 

    feed: function() { 
     mainContent('feed/view', 'feed/model', {}); 
    }, 

    profile: function(username) { 
     mainContent('profile/view', 'profile/model', { username: username }); 
    } 

}); 

});

+0

您認爲什麼解決方案? – 2014-11-23 06:55:28

+0

@coding_idiot 1)Marionette文檔說:「如果你用相同的視圖重新調用show,默認情況下什麼都不會發生,因爲視圖已經在該區域了。var myView = new MyView(); MyApp.mainRegion.show(myView) ;/*第二個顯示調用將重新顯示視圖*/MyApp.mainRegion.show(myView);「。因爲我認爲如果我將佈局的新實例傳遞給show(),我認爲該區域將重新呈現它當前的視圖,我認爲要在全局中創建「main/layout」。 2)使用main.currentView.content.hasView(),因爲'layout/home'沒有'content'區域。 – alexb 2014-11-23 13:33:46

回答

0

如果您正在使用區域,則無需擔心。僅當視圖與該區域中的當前視圖不同時才顯示重新呈現。此外,您可以手工檢查:

if (main.currentView instanceof Layout) { 
    ... 
} 
+0

我不確定同一個類的不同實例不會被視爲不同的視圖...順便說一句,檢查instanceof是一個非常好的主意,我認爲:)它的作用就像一個魅力。 – alexb 2014-11-23 13:45:58