Yasal Uyarı: Ben pager.js hakkında hiçbir şey bilmiyorum, ama benim genel nakavt deneyim hala yardımcı olacağını umuyorum. bağlama örneğin bakıldığında
, page
URL'den başlangıç değerleri kullanarak görünür değişikliklerin oluşturmak gibi görünüyor. İlk içgüdüm bu bağlayıcıyı genişletmek ve bu değerlerin her birinin aboneliğinin URL'yi güncellediğinden emin olmak olacaktır.
Let isminin twoway-page
bağlayıcı:
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);
// ...
}
}
Ve örnek üzerinde diyoruz bağlayıcı oluyor:
<div data-bind="twoway-page: {
id: 'start',
params: ['first','last']
}">
page.init
çağırdıktan sonra bağlama sayfa ViewModel genişletti, tanımlanan gözlenebilirleri ekleyerek params
dizesi, viewModel
nesnesine. Bu, bu gözlenebilirlerdeki değişikliklere abone olabileceğimiz anlamına gelir.
sonraki hedefi, doğru karma bilgisayar edilir. page-href
bağının href
özniteliğini nasıl hesapladığını araştırdım. Tersine, path
ve params
özelliğine sahip bir nesnede pager.page.path()
özelliğini kullanır. Hesaplanan bir gözlemlenebilir içinde benzer bir nesne oluşturmaya çalıştım.
// ...
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" } });
Bir pager.js yöntemi ile karma güncellemek için bir "temiz" bir yol bulamadık ama içten, pagerjs da var gibi görünüyor olsa da (bir değer ayarlamak için
location.hash = "newhash"
kullandığı fark ettiniz
tarih/html5 alternatifi ...).
<div>
<span>First name:</span>
<input type="text" data-bind="textInput: first">
</div>
: yerine örnekten
text
bağları, böylece biz değerleri güncelleyebilirsiniz
textInput
bağlamaları kullanacağız, Şimdi
// ...
pathObj.subscribe(function(newValue) {
location.hash = pager.page.path(newValue);
});
: Neyse, biz karma güncellemek için bizim gözlemlenebilir abone olabilirsiniz
Yani, tamamlamayı:
- varolan çağrı cihazı uzatmak için en iyi tahmin olurdu.js ciltleme
- URL'de güncellenmesi gereken tüm yeniliklere abonelikler oluşturun
- Değerler değiştiğinde karma değeri otomatik olarak güncelleyin; Konumu karma ile malzeme yapmak güncellemeleri
aşırı yüklenmesini önleyecek bir rateLimit
uzantısını kullanmak Turp göstermek biraz zor, bu yüzden kavramı benim belgesinin bir gif kaydettik:
komple özel bağlama kodudur: yüzden yeni bir yanıt eklemek zorunda ben bir yorum ekleyemezsiniz
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 }
}
};
+1. IMO, en iyi çözüm, kontrollere açıkça bağlı olmayacaktır (ör.kontroller navigasyon üretmez, ancak değişikliklerini kendi varlığını güvenle kabul edebilen ve farklı bir versiyonuna gidebilen page viewmodel'e iletir. – TheHansinator