2013-08-24 3 views
3

Я использую Pager.js и withOnShow для динамического получения правильных данных с помощью подстановочного знака. Он работает при первом посещении страницы, но если вы перейдете к новому идентификатору, вернется правильный viewModel, но привязки не будут обновлены.Pagerjs не обновляется с помощью OnShow после первого посещения

Html:

<div data-bind="page: {id: 'start'}"> 
    <a href="" data-bind="page-href: '/11'">id 11</a> 
    <a href="" data-bind="page-href: '/12'">id 12</a> 
</div> 
<div data-bind="page: {id: '?', withOnShow: showView}"> 
    <h1 data-bind="text:id"></h1> 
    <a href="" data-bind="page-href: '/11'">id 11</a> 
    <a href="" data-bind="page-href: '/12'">id 12</a> 
</div> 

JS

vm = ko.mapping.fromJS({test: 1}); 
vm.showView = function(callback, page) { 
    console.log(page.currentId); 
    vm = ko.mapping.fromJS({id: page.currentId}); 
    callback(vm); 
}; 
pager.useHTML5history = true; 
pager.Href5.history = History; 
pager.extendWithPage(vm); 
ko.applyBindings(vm); 
pager.startHistoryJs(); 

jsFiddle: http://jsfiddle.net/xU4Uu/

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

Я использую это неправильно или это ошибка в pager.js? Я нахожусь в центре проекта, и мне действительно нужно заставить это работать. Кто-нибудь решил это как-то?

+0

Жаль, что я мог бы помочь, но не совсем уверен, что делает Pager.js. +1 надеюсь, что кто-то еще найдет ваш вопрос. –

+0

Это может быть ошибка pager.js ... потому что если вы измените версию KO на 2.2.1, она будет работать: http://jsfiddle.net/j8BTC/. Кстати, есть более новая версия pager.js 1.0.1: https://github.com/finnsson/pagerjs#101, где они утверждают, что исправили эту проблему несовместимости ... – nemesv

ответ

1

Ваш код воссоздает viewmodel каждый раз, когда вызывается .showView. Вы не должны воссоздавать viewmodel, а только обновлять его свойства.

Изменение:

vm = ko.mapping.fromJS({id: page.currentId}); 

к:

ko.mapping.fromJS({id: page.currentId}, vm); 

Использование ko.mapping.fromJS с VM в качестве второго параметра обновит пользователей VM с новыми значениями (переданных с первым параметром, соответственно).

Исправленная скрипку: http://jsfiddle.net/xU4Uu/1/

+0

Спасибо, теперь кажется очевидным, но нет примеров показывают это в действии. Благодаря! –

+0

Я не думаю, что это ответ. Можно использовать независимый (то есть не привязанный к $ root) контекст; попробуйте . То, что он генерирует его динамически в pagerjs, не имеет значения. –