2012-01-17 2 views
27

Я использую магистраль для создания своего веб-приложения.Как обновить страницу в базовом приложении

В настоящее время у меня возникла проблема с тем, что если я нахожусь на главной странице, я не могу обновить одну и ту же страницу, просто нажав кнопку «домой».

Я считаю, что это ограничение, предусмотренное по позвоночнику (не перезагружать страницу, если тот же URL называется)

enter image description here

Есть ли способ обойти это? Чтобы я мог инициировать перезагрузку страницы, когда я снова нажимаю кнопку «домой», т. Е. Снова вызывает тот же URL-адрес?

ответ

27

Глядя на источник backbone.js, кажется, что это невозможно по умолчанию, поскольку оно реагирует только на изменение URL-адреса. А так как нажатие одной и той же ссылки вы не инициируете событие изменения.

Код в Backbone.History:

$(window).bind('hashchange', this.checkUrl); 

Вам нужно обрабатывать не-изменить себя. Вот что я сделал:

$('.nav-links').click(function(e) { 
    var newFragment = Backbone.history.getFragment($(this).attr('href')); 
    if (Backbone.history.fragment == newFragment) { 
     // need to null out Backbone.history.fragement because 
     // navigate method will ignore when it is the same as newFragment 
     Backbone.history.fragment = null; 
     Backbone.history.navigate(newFragment, true); 
    } 
}); 
+0

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

+4

Я не знаю, был ли этот ответ когда-либо правильным, но это уже не так. 'Backbone.history.loadUrl' делает именно то, что нужно, см. Мой ответ. – amiuhle

0

Это не до позвоночника. То же самое прекрасно работает в chrome (webkit browser), но не в firefox. Его поведение в браузере

0

Разница между http://localhost.com/ и http://localhost.com/#!/ заключается в том, что вторая ссылка на якорь, она не загружает страницу, она ищет только привязку на текущей странице и прокручивает ее, если она найдена. Вам нужно, чтобы ваша ссылка выглядела как первая, а «#» - близко к концу.

2

мне нужно «освежить» мою страницу на событие изменения ориентации, потому что не все мои вопросы СМИ CSS для портретного режима, где выполнены правильно по умолчанию. Это то, что я в конечном итоге делает:

Backbone.history.fragment = null; 
Backbone.history.navigate(document.location.hash, true); 

Конечно, для полноты этого ответа, это был завернут в какой-то код обработки изменение ориентации:

window.addEventListener('orientationchange', function() { 
    Backbone.history.fragment = null; 
    Backbone.history.navigate(document.location.hash, true); 
}, false); 
7

В случае, если вы хотите, чтобы перезагрузить всю страницы с желаемым видом. Это может сделать сены для кнопки «домой». Преимуществом будет то, что он обновит память.

Перейти к любому маршруту, не загружая его (без «истины»), а затем перезагрузить

Backbone.history.navigate('route/goes/here'); 
window.location.reload(); 
+1

Благодарим вас за это. Это также обновляет сеансы на стороне сервера. – Leahcim

0

Вы часто можете изменить свой маршрут, чтобы включить восклицательный знак, так что вы можете добавить случайную строку в конце из href, чтобы сделать его уникальным, но все равно соответствовать «домашнему» маршруту. (Примечание: сделайте это своим последним маршрутом.)

В маршрутах:

routes: { 
    "*str": "home" 
} 

По мнению:

render: function() { 
    var data = {href: +(new Date())}; 
    _.extend(data, this.model.attributes); 
    this.$el.html(this.template(data)); 
    return this; 
} 

в шаблоне (рули показано здесь):

<a href="{{href}}">Home Link</a> 
1

Вы также можете просто сделать бессмысленным изменения в URL, добавив случайное число до конца:

var url = $(this).attr('href') + '?rand=' + Math.floor(Math.random() * 1000); 
Backbone.history.navigate(url, true); 

Это особенно полезно для IE, так как он не будет запрашивать новые данные через вызов AJAX, если URL не имеет изменилось.

36

Вы ищете Backbone.history.loadUrl. От Annotated Source:

Попытка загрузить текущий фрагмент URL-адреса. Если маршрут завершается с совпадением, возвращается true. Если определенные маршруты не совпадают с фрагментом, возвращается false.

Таким образом, для простой ссылки обновления, вы можете добавить следующее событие в Backbone.View:

events: { 
    'click a#refresh': function() { 
    Backbone.history.loadUrl(); 
    return false; 
    } 
} 
+2

Это гораздо лучший ответ: короче, чище, и это не связано с ошибкой с «внутренними» («Backbone.history.fragment') Backbone. – machineghost

0

Для того, чтобы обеспечить многоразовый фрагмент кода, который я увеличивал Backbone.View с вспомогательным методом чтобы повторно использовать его везде, где нам нужно перезагрузить одну и ту же страницу, несмотря на ограничения маршрутизатора Backbone.

В нашем файле app.js или любом другом соответствующем месте

Backbone.View = Backbone.View.extend({ 
    refreshPage: function(e){ 
     if(e.target.pathname){ 
      Backbone.history.navigate(e.target.pathname); 
     } 
     window.location.reload();   
    } 
}); 

Таким образом, если мы имеем связь, такие как

<a href="/whatever" id="whateverId">Some text </a> 

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

events: { 
    'click #whateverId': 'refreshPage', 
} 

Насколько нам не нужно менять «тег» это чистое решение, которое сэкономить шаблонное кодирование

Надеется, что это помогает

0

Он работает с

myBackboneRouter.navigate("users", {trigger: true}) 
1

Вы можете легко обновить страницу с помощью ниже подхода:

@win_loc = window.location.toString().replace("#","") 
Backbone.history.redirectTo(@win_loc) 
5

backbone.history.loadUrl является решением.

Клик функции кнопки Home обработка (если дом является корень/вашего WebApp) должен быть:

myAppRouter.navigate(''); 
Backbone.history.loadUrl(); 
+0

Nice и Simple – SSS

0

Вот мой любимый подход до сих пор:

if (!Backbone.history.navigate(urlPath, true)) { 
     Backbone.history.loadUrl(); 
}