Магистральный маршрутизатор работает неправильно

Я создаю простое магистральное приложение с 4 маршрутами: домой, о, конфиденциальность и условия. Но после настройки маршрутов у меня есть 3 проблемы:

Представление «термины» не отображается;

Когда я обновляю страницу #about или #privacy, главная страница отображается после страницы #about/#privacy.

Когда я нажимаю кнопку «Назад», домашний вид никогда не отображается. Например, если я нахожусь на странице #о и нажимаю кнопку «Назад» на главную страницу, представление «о нас» остается на странице.

Я не знаю, что я делаю неправильно с 1-й проблемой. Я думаю, что 2-я и 3-я проблемы связаны с тем, что чего-то не хватает в домашнем роутере, но я не знаю, что именно.

Вот мой код:

HTML

<section class="feed">

    <script id="homeTemplate" type="text/template">

        <div class="home">
        </div>

    </script>

    <script id="termsTemplate" type="text/template">

        <div class="terms">
        Bla bla bla bla
        </div>

    </script>   

    <script id="privacyTemplate" type="text/template">

        <div class="privacy">   
        Bla bla bla bla
        </div>

    </script>

    <script id="aboutTemplate" type="text/template">

         <div class="about">
         Bla bla bla bla
         </div>

    </script>

</section> 

Виды

app.HomeListView = Backbone.View.extend({
    el: '.feed',

    initialize: function ( initialbooks ) {
         this.collection = new app.BookList (initialbooks);
         this.render();
    },

    render: function() {
         this.collection.each(function( item ){
         this.renderHome( item );
         }, this);
    },

    renderHome: function ( item ) {
         var bookview = new app.BookView ({
         model: item
         })
         this.$el.append( bookview.render().el );
         }  });

app.BookView = Backbone.View.extend ({
    tagName: 'div',
    className: 'home', 

     template: _.template( $( '#homeTemplate' ).html()),

    render: function() {
         this.$el.html(this.template(this.model.toJSON()));
         return this;
         }  
 });

app.AboutView = Backbone.View.extend({
     tagName: 'div',
     className: 'about',

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

     template: _.template( $( '#aboutTemplate' ).html()),

     render: function () {
         this.$el.html(this.template());
         return this;
     }
});

 app.PrivacyView = Backbone.View.extend ({
     tagName: 'div',
     className: 'privacy',

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

     template: _.template( $('#privacyTemplate').html() ),

     render: function () {
         this.$el.html(this.template());
         return this;
     }
});

 app.TermsView = Backbone.View.extend ({
     tagName: 'div',
     className: 'terms',

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

     template: _.template ( $( '#termsTemplate' ).html() ), 

     render: function () {
         this.$el.html(this.template()),
         return this;
     }
 });

И роутер:

var AppRouter = Backbone.Router.extend({
     routes: {
         '' : 'home',
         'about' : 'about',
         'privacy' : 'privacy',
         'terms' : 'terms'
     },

     home: function () {
         if (!this.homeListView) {
             this.homeListView = new app.HomeListView();
         };
     },

     about: function () {
         if (!this.aboutView) {
             this.aboutView = new app.AboutView();
        };
         $('.feed').html(this.aboutView.el);
     },

     privacy: function () {
         if (!this.privacyView) {
             this.privacyView = new app.PrivacyView();
         };
         $('.feed').html(this.privacyView.el);
     },

     terms: function () {
          if (!this.termsView) {
             this.termsView = new app.TermsView();
         };
         $('.feed').html(this.termsView.el);
     }
 })

 app.Router = new AppRouter();
 Backbone.history.start(); 

Я что-то упускаю, но не знаю что.

Спасибо


person swayziak    schedule 25.06.2013    source источник


Ответы (2)


Я думаю, вам нужно переместить шаблоны сценариев из вашего html-элемента .feed, когда вы визуализируете представление HomeListView, оно удалит все внутри своего el, тогда шаблоны сценариев будут недоступны для других представлений, которые вы вызываете. iside из HomeListView .

<section class="feed">



</section>
<script id="homeTemplate" type="text/template">

    <div class="home">
    </div>

</script>

<script id="termsTemplate" type="text/template">

    <div class="terms">
    Bla bla bla bla
    </div>

</script>   

<script id="privacyTemplate" type="text/template">

    <div class="privacy">   
    Bla bla bla bla
    </div>

</script>

<script id="aboutTemplate" type="text/template">

     <div class="about">
     Bla bla bla bla
     </div>

</script> 

также вам не хватает двоеточия в функции рендеринга для termsView

  render: function () {
     this.$el.html(this.template());
     return this;
  }
person Rayweb_on    schedule 25.06.2013
comment
Спасибо за ответ, я попробовал ваше предложение, но у меня все еще те же проблемы. - person swayziak; 26.06.2013
comment
также вам не хватает двоеточия в функции рендеринга для termsView - person Rayweb_on; 26.06.2013
comment
Ошибка в консоли следующая: Uncaught SyntaxError: Unexpected token return. Где мне не хватает двоеточия в termsView? - person swayziak; 26.06.2013
comment
в вашей функции рендеринга вам не хватает этой строки this.$el.html(this.template()), - person Rayweb_on; 26.06.2013
comment
Я уже обнаружил недостающее двоеточие. Итак, 1-я проблема решена. Спасибо! Теперь мне нужно решить другие 2 проблемы - person swayziak; 26.06.2013
comment
В консоли ошибок нет - person swayziak; 27.06.2013
comment
вы знакомы с jsfiddle? если вы можете вставить свой код, будет здорово. так что мы можем отладить его там. - person Rayweb_on; 27.06.2013
comment
Да, я знаком с jsfiddle. Вот ссылка на код: jsfiddle.net/swayziak/Mm8Mt Спасибо. - person swayziak; 27.06.2013
comment
Я забыл сказать, что в конце кода у меня есть это для тестирования приложения: jsfiddle.net/swayziak/ rBh2L и, возможно, какая-то часть этого кода связана с моими проблемами - person swayziak; 30.06.2013

В дополнение ко всему, что предлагает Rayweb_on, удалите вызов render из методов initialize AboutView, PrivacyView и TermsView и в своих функциях маршрута замените $('.feed').html(this.aboutView.el); и т. д. на $('.feed').html(this.aboutView.render().el); и т. д.

Кроме того, определите переменную в вашем маршрутизаторе с именем currentView или что-то в этом роде и установите для нее любое представление, выбранное вашими функциями маршрутизации. В каждой функции маршрута проверьте, была ли она установлена, и если да, вызовите для нее remove() перед рендерингом нового представления. Эти изменения должны препятствовать тому, чтобы ранее визуализированные представления наступали на новые, и обеспечивать актуальность вновь отображаемого представления.

person ebohlman    schedule 26.06.2013
comment
Спасибо за ответ. Как я могу установить currentView для любого представления, которое выбирают функции маршрута, и как я могу проверить, была ли установлена ​​​​каждая функция маршрута, и вызвать remove () перед визуализацией нового представления? Извините, но я все еще изучаю Backbone, поэтому помощь всегда приветствуется. Спасибо - person swayziak; 27.06.2013