2013-09-24 3 views
1

У меня есть приложение с 3 страницами, которые я пытаюсь отобразить на клике. Первая страница - целевая страница. Остальные два должны отображаться при нажатии ссылки. Все они содержатся внутри одного и того же контейнера DIV # модальной-контентаRender Backbone View on click (через состояние нажатия маршрутизатора)

Мой HTML выглядит следующим образом:

<script type="text/x-handlebars-template" id="landingPage"> 
    <div> 
     <div class="auth-wrapper"> 
      <div class="logo"> 
       <img src="img/login/logo-landing.png"/> 
      </div> 
      <div class="to-auth-buttons-wrapper"> 
       <a class="btn-to-auth btn-login" href="#signup-page">Sign Up</a> 
       <a class="btn-to-auth btn-signup" href="#login-page">Log In</a> 
      </div> 
     </div> 
    </div> 
</script> 

Моя функция маршрутизатора заключается в следующем:

var Approuter = Backbone.Router.extend({ 
    initialize: function() { 
     console.log('router initialized'); 
      Backbone.history.start({ pushState: true }); 
    }, 

    routes: { 
     '': 'main', 
     'signup-page' : 'signup', 
     'login-page' : 'login' 
    }, 

    main: function() { 
     this.landing = new LandingView({ el: $('#modal-content') }); 
     slider.slidePage(this.landing.$el); 
    }, 

    signup: function() { 
     this.signuppage = new SignUpView({ el: $('#modal-content') }); 
     console.log("LANDING VIEW: Signup clicked"); 
    }, 

    login: function() { 
     this.loginpage = new LoginView({ el: $('#modal-content') }); 
     console.log("LANDING VIEW: Login clicked"); 
    } 
}); 

И просмотр файлов следующим образом:

var SignUpView = Backbone.View.extend({ 
    initialize: function() { 
     this.render(); 
    }, 

    render: function() { 
     var template = Handlebars.compile($('#signUpPage').html()); 

     this.$el.html(template); 
    }, 
}); 

и

var LoginView = Backbone.View.extend({ 
    initialize: function() { 
     this.render(); 
    }, 

    render: function() { 
     var template = Handlebars.compile($('#loginPage').html()); 

     this.$el.html(template); 
    }, 
}); 

Кроме того, здесь мои шаблоны:

<div id="modal-content"> 

    <script type="text/x-handlebars-template" id="landingPage"> 
     <div> 
     <div class="auth-wrapper"> 
      <div class="logo"> 
       <img src="img/login/logo-landing.png"/> 
      </div> 
      <div class="to-auth-buttons-wrapper"> 
       <a class="btn-to-auth btn-login" href="#/signup-page">Sign Up</a> 
       <a class="btn-to-auth btn-signup" href="#/login-page">Log In</a> 
      </div> 
     </div> 
     </div> 
    </script> 

    <script type="text/x-handlebars-template" id="signUpPage"> 
     <div> 

     <div class="header"> 
      <a href="#" class="btn">Back</a> 
     </div> 
     <div class="auth-wrapper"> 


      <div class="logo"> 
       <img src="img/login/logo-landing.png"/> 
      </div> 

      <form method="post" id="userSignUp">  
       <input class="form-control input-signin" type="text" name="username" placeholder="Name" id="userName"> 
       <input class="form-control input-signin" type="text" name="useremail" placeholder="Email" id="userEmail"> 
       <input class="form-control input-signin" type="text" name="userpass" placeholder="Password" id="userPassword"> 

       <a class="btn-to-auth btn-login js-btn-login">Sign Up</a> 
      </form> 
     </div> 

     </div> 
    </script> 

    <script type="text/x-handlebars-template" id="loginPage"> 
     <div> 
     <div class="header"> 
      <a href="#" class="btn">Back</a> 
     </div> 
     <div class="auth-wrapper"> 


      <div class="logo"> 
       <img src="img/login/logo-landing.png"/> 
      </div> 

      <form method="post" id="userSignIn">  
       <input class="form-control input-signin" type="text" name="useremail" placeholder="Email" id="userEmail"> 
       <input class="form-control input-signin" type="password" name="userpass" placeholder="Password" id="userPassword"> 
       <a class="btn-to-auth btn-login js-btn-login">Log In</a> 
      </form> 
     </div> 

     </div> 
    </script> 

</div> 

Моя проблема После нажатия A # SIGNUP-страницы или # Логин-страницы ссылки, я могу увидеть изменения URL-адрес, чтобы «локальный/# signup-page ", но представление не отображается.

НО Когда я обновить страницу в LOCALHOST/# SIGNUP-странице или локальный хосте/# входа-странице, я вижу мнение оказано.

Куда я иду не так?

+0

попытаться установить 'pushState' на' false' –

+0

Хм .. Кажется, теперь проблема подчеркивания ... – iggy2012

ответ

1

Пожалуйста, обратите внимание на приведенный выше код:

<html> 

    <body> 
     <div class="action"> 
      <a name="routeOne" href="#routeTwo">routeOne</a> 
      <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> 
      <a name="routeTwo" href="#routeOne">routeTwo</a> 
     </div> 
     <div class="output"></div> 


     <script type="text/javascript" src="lib/jquery.js"></script> 
     <script type="text/javascript" src="lib/underscore.js"></script> 
     <script type="text/javascript" src="lib/backbone.js"></script> 

     <script type="text/javascript"> 
      var Approuter = Backbone.Router.extend({ 
       initialize: function() { 
        console.log('router initialized'); 
        Backbone.history.start({pushState:true}); 
       }, 

       routes: { 
        '': 'main', 
        'routeOne' : 'routeOne', 
        'routeTwo' : 'routeTwo' 
       }, 

       main: function() { 
        console.log("main"); 
       }, 

       routeOne: function() { 
        console.log("routeOne"); 
       }, 

       routeTwo: function() { 
        console.log("routeTwo"); 
       } 
      }); 

      var routes = new Approuter(); 

     </script> 
    </body> 
</html> 

Edit1: Различия между маршрутами и PushState

Магистральные Маршруты позволяют Вам мониторинг hasChange истории событий (изменения в URL) и вызвать некоторые js-код при обнаружении изменений в url (http://localhost/backbone-test/#someRoute). Это потрясающе, потому что мы можем инициировать некоторые сложные действия, выполненные пользователем на вашем веб-сайте, просто называя URL-адрес.

PushState позволяет скрыть этот хэш «#» и превратить ваш URL более читаемым, но в качестве основы документации сказал

«, если у вас есть маршрут/документы/100, ваш веб-сервер должен быть способен , чтобы обслуживать эту страницу, если браузер сразу посещает этот URL ».

Затем, если вы используете pushState:true ваш URL стать более удобным для чтения, http://localhost/backbone-test/#someRoute к http://localhost/backbone-test/someRoute, но вам нужно создать фоновым непосредственно ответить на доступ к вам читаемый URL.

Когда pushState имеет значение true, и вы вызываете href="#someRoute", браузер понимает это как привязку html.

+0

Что делает pushstate: false делать точно?У меня создалось впечатление, что pushstate: true имеет важное значение для того, чтобы маршрутизация произошла – iggy2012

+0

@ iggy2012 ваш ответ в моем отредактированном ответе. –

+0

Спасибо! Это было очень полезно. – iggy2012