2014-01-02 4 views
1

Мое одностраничное веб-приложение состоит из 4-5 видов, расположенных вертикально, когда пользователь выбирает пункт меню, страница будет прокручиваться до соответствующего вида. Когда вы впервые заходите в приложение, это не проблема, однако если вы глубоко привязываетесь к элементу меню, моя страница подбрасывает его, потому что он пытается получить доступ к свойствам элемента, который еще не существует.Магистральный маршрутизатор и глубокая связь

Проблема, с которой я сталкиваюсь, заключается в понимании того, почему элементы не существуют в момент, когда маршрутизатор пытается прокрутить страницу.

Если вы загружаете/и затем выбираете дом без проблем, но если вы прямо удаляете #home через браузер, то когда я получаю jQuery неопределенные ошибки.

Uncaught TypeError: Не удается прочитать свойство «сверху» неопределенной

Внутри маршрутизатора я инстанцировании и рендеринга всех моих взглядов в функции инициализации. Идея заключается в том, что инициализация всегда будет происходить до любого из моих маршрутов, явно не так.

Снова я прочитал несколько тем, которые показывают, как иметь функции до и после для всех маршрутов отдельных маршрутов, но даже с использованием этого подхода scrollToById терпит неудачу, потому что он не знает, что такое $ (id) на время вызова.

define(function (require, exports, module) { 

     var Backbone = require('backbone'); 

     return Backbone.Router.extend({ 
      initialize: function(){ 
       require(['ui/menu/menu','ui/home/home', 'ui/samples/samples', 'ui/resume/resume', 'ui/contact/contact'], 

       function(Menu, Home, Samples, Resume, Contact){ 

        var menu = new Menu(); 
         menu.render(); 

        var home = new Home(); 
         home.render(); 

        var samples = new Samples(); 
         samples.render(); 

        var resume = new Resume(); 
         resume.render(); 

        var contact = new Contact(); 
         contact.render(); 

       }); 
      }, 
      routes: { 
       ''   : 'init', 
       'home'  : 'home', 
       'samples' : 'samples', 
       'resume' : 'resume', 
       'contact' : 'contact' 
      }, 
      init: function(){ 

      }, 
      home: function(){ 
       this.scrollToById($(".home-container")); 
      }, 
      samples: function(){ 
       this.scrollToById($(".samples-container")); 
      }, 
      resume: function(){ 
       this.scrollToById($(".resume-container")); 
      }, 
      contact: function(){ 
       this.scrollToById($(".contact-container")); 
      }, 
      scrollToById: function(id) { 
       var val = $(id).offset().top - 127; 

       $('html, body').animate({ 
         scrollTop: val 
       }, 2000); 
      } 
     }); 

    }); 

Оцените любые советы и рекомендации.

ответ

2

Я думаю, что обработчики событий routes в маршрутизаторе получают инициализацию одновременно с функцией initialize. Из-за этого события маршрута запускаются, прежде чем элементы DOM будут визуализированы.

Я бы попытался сделать новую функцию вне маршрутизатора, которая содержит все, что находится внутри функции инициализации. Тогда последним в этой функции может быть создание экземпляра маршрутизатора. Это гарантирует, что вызовы маршрутов не будут вызываться до тех пор, пока не будут загружены ваши сценарии и DOM.

+1

Благодарим вас за совет, который должен работать, и я согласен с тем, что обработчик событий маршрутов, вероятно, инициализируется одновременно с функцией инициализации. Другая вещь, которую я рассматривал, которая, вероятно, является лучшей логикой, чем мой первоначальный план, заключается в том, что диспетчер приложений и события будут иметь диспетчер приложений, который фактически обрабатывал бы прокрутку страницы. Поэтому, когда маршрут изменяется, отправьте уровень вверх и попросите контроллер приложения работать с ногами. Идея состоит в том, чтобы также отделить логику прокрутки от маршрутизатора. –

+0

Да, эта статья (http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/) показывает, как это хорошо Идея иметь маршруты только для отправки события и ничего больше. –

+0

Спасибо за ссылку, по какой-то причине она перепуталась. http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/ У меня есть все, что работает с вашим подходом, просто чтобы проверить это было действительно маршрутами и init противоречивыми. Я пойду с помощью диспетчерского подхода. –

Смежные вопросы