2014-11-17 2 views
0

Я пытаюсь заставить pushState работать в моем базовом приложении. Он отлично работает, просто щелкнув ссылку. Но если я обновить страницу, я получаю 404.pushState in backbone.js

Router

Router = Backbone.Router.extend({ 
    routes: { 
     'home': 'home' 

    }, 

    home: function() { 
     new HomeView({el:'#main-view'}) 
    } 
}); 

Когда тег получает щелкнул: история

event.preventDefault(); 
App.navigate(event.target.pathname, { trigger: true }); 

старт:

Backbone.history.start({pushState:true}); 

и HTML:

   <li> 
        <a href="/home">home</a> 
       </li> 

Неправильный телефон?

+1

уверен, могу поспорить, вы не имеете любую страницу доступную по этому адресу – Evgeniy

+0

Сво одной страницы приложения. И в позвоночнике вы не можете действительно загружать страницы (как, как я знаю), в хорошем смысле. Каждое представление загружает собственный шаблон. (underscore.js). – user2952238

+2

Из http://backbonejs.org/#History - «Обратите внимание, что использование реальных URL-адресов требует, чтобы ваш веб-сервер мог правильно отображать эти страницы, поэтому необходимы и внутренние изменения». Также это может помочь вам понять https://blog.twitter.com/2012/implementing-pushstate-for-twittercom –

ответ

0

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

Для этого вы можете обращаться с ссылками, чтобы сказать «Магистраль»: «обрабатывайте мои ссылки!».

Вот пример JS, который я использую для обработки ссылок, которые имеют «внутренний» CSS-класс в качестве маршрута.

'use strict'; 
var Backbone = require('backbone'); 
var $ = require('jquery'); 
Backbone.$ = $; 

module.exports = function() { 
    // Use absolute URLs to navigate to anything not in your Router. 

    var openLinkInTab = false; 

    // Only need this for pushState enabled browsers 
    if (Backbone.history._hasPushState) { 


    // console.log('YES you have push state !'); 

    $(document).keydown(function(event) { 
     if (event.ctrlKey || event.keyCode === 91) { 
     openLinkInTab = true; 
     } 
    }); 

    $(document).keyup(function() { 
     openLinkInTab = false; 
    }); 

    // Use delegation to avoid initial DOM selection and allow all matching elements to bubble 
    $(document).on('click', 'a.innerlink', function(evt) { 
     // Get the anchor href and protcol 
     var href = $(this).attr('href'); 
     var protocol = this.protocol + '//'; 

     console.log('backbone_pushstate_router:', href, protocol); 

     evt.preventDefault(); 

     // Ensure the protocol is not part of URL, meaning its relative. 
     // Stop the event bubbling to ensure the link will not cause a page refresh. 
     if (!openLinkInTab && href.slice(protocol.length) !== protocol) { 
     evt.preventDefault(); 

     // Note by using Backbone.history.navigate, router events will not be 
     // triggered. If this is a problem, change this to navigate on your 
     // router. 
     Backbone.history.navigate(href, true); 
     } 
    }); 
    } else { 
    console.warn('no push state'); 
    } 
}; 

Наслаждайтесь :)