Pagerjs не обновляется с помощью OnShow после первого посещения

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

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? Я в середине проекта, и мне действительно нужно, чтобы это работало. Кто-нибудь решил это как-то?


person Michael Lindfors    schedule 24.08.2013    source источник
comment
Хотел бы я помочь, но не совсем уверен, что делает Pager.js. +1, чтобы помочь кому-то найти ваш вопрос.   -  person PW Kad    schedule 24.08.2013
comment
Это может быть ошибка pager.js... потому что, если вы измените версию KO на 2.2.1, она будет работать: jsfiddle. нетто/j8BTC. Кстати, есть более новая версия pager.js 1.0.1: github.com/finnsson/pagerjs#101 где они утверждают, что исправили эту проблему несовместимости...   -  person nemesv    schedule 24.08.2013


Ответы (1)


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

Изменять:

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

to:

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

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

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

person Rango    schedule 24.08.2013
comment
Спасибо, теперь это кажется довольно очевидным, но ни один из примеров не показывает это в действии. Спасибо! - person Michael Lindfors; 28.08.2013
comment
Я не думаю, что это ответ. Можно использовать независимый (то есть не привязанный к $root) контекст; попробуйте ‹!-- ко с: {foo: 'bar'} --›. То, что оно генерируется динамически в pagerjs, не должно иметь значения. - person Christopher Monsanto; 12.11.2013