【发布时间】:2015-06-21 20:48:03
【问题描述】:
我想在 Knockout 中使用令人敬畏的光滑轮播 (http://kenwheeler.github.io/slick/)。在查看了其他一些问题 (https://stackoverflow.com/questions/26368176/slick-js-carousel-not-working-with-knockout-template-binding) 之后,似乎要使用自定义绑定,但我无法正确加载它 - 看起来光滑的轮播正在初始化之前DOM 已完全加载,因此它不会将最后一张幻灯片连接到第一张幻灯片。我还查看了knockout js custom binding called after internal dom elements rendered 并尝试使用子绑定上下文来让自定义绑定强制子元素首先绑定。
这里是html标记:
<div data-bind = "slick">
<!-- ko foreach: results -->
<div>
<result-thumbnail params="result:$data"></result-thumbnail>
</div>
<!-- /ko -->
</div>
result-thumbnail 是一个单独的剔除组件,用于格式化我想在轮播中呈现的数据。在自定义绑定文件中:
ko.bindingHandlers.slick = {
init: function(element, valueAccessor, allBindingsAccessor, data, bindingContext) {
var options = {
infinite:true,
slidesToShow: 3,
slidesToScroll: 1,
};
var childBindingContext = bindingContext.createChildContext(
bindingContext.$rawData,
null,
function(context) {
ko.utils.extend(context, valueAccessor());
});
ko.applyBindingsToDescendants(childBindingContext, element);
var local = ko.utils.unwrapObservable(valueAccessor());
ko.utils.extend(options, local);
$(element).slick(options);
return { controlsDescendantBindings: true };
},
update: function(element, valueAccessor, allBindingsAccessor, data, context) {
}
};
我正在考虑的一些事情:
- 我应该将光滑的初始化移动到更新功能吗?
- 我写的自定义绑定是否需要绑定到不同的元素?
- 如果我要更改 results observable 的值,我是否需要通过销毁然后重新创建轮播来更新 slick?
任何帮助将不胜感激!我仍在学习自定义绑定,如果有人有过让光滑的轮播与 Knockout 一起工作的经验,那也很高兴。
【问题讨论】:
标签: knockout.js ko-custom-binding