bfl*_*mi3 5 javascript jquery-deferred knockout.js
我目前有一个基本实现,捕获所有图像已加载但我不满意代码,可伸缩性和UI与viewModel之间的紧密耦合.
我有一个我已经在我的viewModel和bindingHandler之外声明的promises数组,以便每个人都可以访问它.bindingHandler会将每个未解析的promise推送到数组中,init函数将等待,直到数组收到所有已解析的promise.一旦发生这种情况,就会调用一个函数来为所有图像设置统一的高度.
这是UI:
<ul data-bind="foreach: movies">
<li>
<div class="image">
<img data-bind="imageLoad: { src: posters.Detailed, alt: title }"/>
</div>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
另一边:
function ViewModel() {
var self = this;
self.movies = ko.observableArray([]);
self.init = function(data) {
self.isLoading(true);
self.movies = ko.utils.arrayMap(data, function(item) {
return new robot.ko.models.Movie(item);
});
$.when.apply($, promises).done(function () {
robot.utils.setThumbnailHeight($('.thumbnails li'), function () {
self.isLoading(false);
});
});
};
}
ko.bindingHandlers.imageLoad = {
init: function(element, valueAccessor) {
var options = valueAccessor() || {};
var promise = $.Deferred();
var loadHandler = function() { return promise.resolve; };
promises.push(promise);
ko.applyBindingsToNode(element, {
event: { load: loadHandler },
attr: { src: options.src, alt: options.alt }
});
}
}
Run Code Online (Sandbox Code Playgroud)
在一个完美的世界中,我的viewModel只会将一个回调切换到我的bindingHandler,但它将是动态的,它不需要知道关于UI的任何内容,并且bindingHandler将能够找出需要调整的元素.我已经玩弄了某种deferredObservable的想法,但最后我只是不满意在viewModel中.我还想过data-在父元素上使用一个属性来知道实际设置高度的元素,但这看起来很草率.
我觉得我错过了什么.
所以,我问,有什么更好的方法来实现这一点,这将允许松散耦合和可扩展性,这样我就不必专门告诉用户界面做什么(同样多)以及何时从我的viewModel?
在处理它的 foreach 作用域中使用自定义绑定。例如:
<ul data-bind="foreach: movies, uniformHeight: movies">
<li>
<div class="image">
<img data-bind="imageLoad: { src: posters.Detailed, alt: title }"/>
</div>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
根据 ViewModel 的形状做出假设 - 具体来说,假设承诺的状态反映了加载图像的实际状态。BindingHandler 可能看起来像这样:
ko.bindingHandlers.uniformHeight = {
init: function(element, valueAccessor) {
//assume valueAccessor contains an array of promises
$.when.apply($, valueAccessor()()).done(function () {
robot.utils.setThumbnailHeight($(element).find('.thumbnails li'), function () {
self.isLoading(false);
});
});
}
};
Run Code Online (Sandbox Code Playgroud)
这可能需要围绕如何处理逻辑进行更多的重组,robot.ko.models.Movie但根据您发布的内容,没有什么大不了的。
需要更多的管道,但最终可能会更可靠。
您的外部uniformHeight绑定可以在 上注册自身bindingContext并等待子imageLoad绑定各自引发一个事件以通知图像已加载;当它们回来时累积高度,也许会反跳。
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |