我正在單頁面應用程序中工作,我們正在使用Knockout相當廣泛。我們目前有一個可以點擊的項目列表,這樣他們會將一些內容加載到一個模式容器中。下面的圖片說明會觸發各種內容不同的項目進行顯示:延遲加載自定義綁定
這些容器的內容實質上不同,並且可以分佈在多個標籤頁的不同自定義綁定。圖像中的項目非常簡單,只需使用Knockout組件,但是當我們開始顯示模式內容時,它們在JavaScript上更加沉重,因此使用綁定。
我最近添加了組件所需的JavaScript和HTML模板的延遲加載,這非常有效。我不得不使用自定義組件加載程序,因爲我們不想使用require或類似的AMD模塊加載程序。
現在我面臨着與定製淘汰賽綁定相同的問題,因爲我預計隨着此產品的擴展,我們可以非常輕鬆地結束100個綁定。不幸的是,似乎沒有一種明顯的方式來像組件那樣以一種懶惰的方式加載自定義綁定,我試圖找出是否有辦法做到這一點,以及最好的方式是什麼。請注意,我也一直不知道綁定的名稱,有時我可能希望根據observable的名稱動態加載它們。
到目前爲止我唯一能找到的注意事項是有一個ko.getBindingHandler()
函數可以被覆蓋,但它需要一個綁定處理程序的同步加載。
我已經想好了辦法,試圖做到這一點的,但它使用的部件,感覺就像實現我的最終目標的一個非常落後的方式。它會是這樣的:
更換一個慣用的手法結合:
<div data-bind="lineChart: $data"/>
與
<div data-bind="component { name: compName, params: { vm: $data } }"/>
然後我會使用一個自定義組件加載器,這實際上是隻裝載結合處理程序JavaScript,並寫出基本上佔位符div
與自定義綁定在:
var bindingLoader = {
getConfig: function(name, callback) {
if(name.startsWith("binding-")) {
callback({ binding: name.replace("binding-", ""), jsUrl: "/bindings/" + name });
return;
}
callback(null);
},
loadComponent(name, componentConfig, callback) {
var obj = { };
obj.template = '<div data-bind="' + componentConfig.name + ': $data"/>';
$.ajax({ url: componentConfig.jsUrl, dataType: "text" })
.done(function(data)) {
(new Function(data))();
callback(obj);
});
}
}
但是我確定有一個更好的方法來實現這個目標,但我現在想不出其他的選擇。
我對代碼進行了更改,因爲我意識到我的原始版本每次都會重新加載綁定處理程序。 –