Ответ 1
Отказ от ответственности: я ничего не знаю о pager.js, но я надеюсь, что мой общий опыт нокаута все же может помочь.
Если посмотреть на пример, привязка page
, похоже, создает наблюдаемые значения, используя начальные значения из URL-адреса. Моим первым инстинктом было бы расширить эту привязку и убедиться, что подписка на каждое из этих значений обновляет URL-адрес.
Назовите это связывание twoway-page
:
ko.bindingHandlers["twoway-page"] = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// Call pager.js' page binding
ko.bindingHandlers.page.init(element, valueAccessor, allBindings, viewModel, bindingContext);
// ...
}
}
И назовите это на примере привязки:
<div data-bind="twoway-page: {
id: 'start',
params: ['first','last']
}">
После вызова page.init
привязка страницы расширила область просмотра, добавив наблюдаемые значения, определенные в массиве params
, к объекту viewModel
. Это означает, что мы можем подписаться на изменения этих наблюдаемых.
Следующая задача - вычислить правильный хеш. Я посмотрел, как привязка page-href
вычисляет свой атрибут href
. Оказывается, он использует pager.page.path()
для объекта с атрибутами path
и params
. Например:.
var hash = pager.page.path({
path: "user",
params: {
"first": "John",
"last": "Doe"
}
});
Я попытался построить подобный объект в вычисленном наблюдаемом.
// ...
var options = valueAccessor();
var pathObj = ko.computed(function() {
var result = {
path: options.id,
params: {}
};
options.params.forEach(function(param) {
result.params[param] = viewModel[param]();
});
return result;
}).extend({ rateLimit: { timeout: 200, method: "notifyWhenChangesStop" } });
Я не смог найти "чистый" способ обновления хэша с помощью метода pager.js, но я заметил, что внутри pagerjs использует location.hash = "newhash"
для установки значения (хотя, похоже, также существует история /html 5 альтернатива...). Во всяком случае, мы можем подписаться на наш наблюдаемый, чтобы обновить хэш:
// ...
pathObj.subscribe(function(newValue) {
location.hash = pager.page.path(newValue);
});
Теперь вместо привязок text
из примера мы будем использовать привязки textInput
, чтобы мы могли обновить значения:
<div>
<span>First name:</span>
<input type="text" data-bind="textInput: first">
</div>
Итак, чтобы обернуть: лучше всего было бы
- Расширение существующей привязки pager.js
- Создайте подписки на все наблюдаемые, которые необходимо обновить в URL
- Автоматическое обновление хэша при изменении значений; используйте расширение
rateLimit
, чтобы предотвратить перегрузку обновлений.
Делать вещи с хэшем местоположения немного сложно показать в скрипке, поэтому я записал gif моего доказательства концепции:
Полный код обязательного связывания:
ko.bindingHandlers["twoway-page"] = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
ko.bindingHandlers.page.init(element, valueAccessor, allBindings, viewModel, bindingContext)
var options = valueAccessor();
var pathObj = ko.computed(function() {
var result = {
path: options.id,
params: {}
};
options.params.forEach(function(param) {
result.params[param] = viewModel[param]();
});
return result;
}).extend({ rateLimit: { timeout: 200, method: "notifyWhenChangesStop" } });
pathObj.subscribe(function(newValue) {
location.hash = pager.page.path(newValue);
})
return { controlsDescendantBindings: true }
}
};