使用 knockout.js,我试图实现本质上是图像预加载器和缓存器。练习的重点是,除了首先在服务器上处理之外,我正在加载的图像需要相当长的时间来下载。因此,我的 UI(可以在图像集之间浏览)旨在仅在必要时下载这些图像集以减少负载。另外,我不想向用户提供在漫长的等待期间正在发生的事情的指示。
这就是为什么,这里是我当前“如何”的描述:
1:我使用 jQuery .load 来使用实际图像数据填充数组:
images[doc.pages()[i].pagenumber() - 1] = $("<img />").attr('src', path).load(function() {}
我使用 .load 是因为它只在每个网络请求完成后更新 DOM,允许我为代码块中的每次迭代设置一个计数器,以向用户指示正在加载(例如 loadCounter++;)
2:在 .load 回调中,我现在这样做:
if(loadedPages === doc.pages().length){
if(loadedPages === doc.pages().length){
for(var x = 0; x < images.length; x++){
$("#" + doc.idname()).append(images[x]);
}
}
}
这里发生的是 images 数组包含实际准备就绪的 HTML 图像 DOM 元素,一旦所有网络请求完成,这些元素就可以直接注入到结构中。
这是我目前的方式,这也是我接下来想要实现的目标:
而不是这样做,我想用相同的图像数据填充一个淘汰赛 observableArray,并对其进行 foreach 绑定,例如:
<div data-bind="foreach:images">
<img data-bind="what goes here?">
</div>
这个例子最终解决了我的问题。淘汰赛中的数据绑定结构通常让您绑定到属性,例如<img data-bind="attr:{src:path}
. 但是,这样做会导致每次 dom 更新时重新加载图像(浏览时删除图像数据)。
所以最后,提炼出的问题是:我可以像我的示例中那样使用 DOM 图像元素填充 observableArray 并使用 knockout.js 迭代它们吗?如果这不可行或不切实际,是否还有其他用于缓存和迭代图像的解决方案,最好是淘汰赛?
在此先感谢,回答将得到奖励
更新
可以使用<object>
标签吗?例如<object data-bind="attr:{data: $data.imageData}"></object>
。我现在正在玩它,但我只得到 [object Object]。