1

我正在处理图像列表。图片是动态加载的;引用列表存储在 observableArray 中。完整加载图像列表后,我想连接 DOM 元素的处理程序。我目前的实现:

在视图中:

<div class="carousel_container" data-bind="template: { 'name': 'photoTemplate', 'foreach': ImageInfos, 'afterRender': renderCarousel }">
<script type="text/html" id="photoTemplate">
//...content of template
</script>

在视图模型中:

self.counterCarousel = 0;
self.renderCarousel = function (elements) {
    var allImagesCount = self.ImageInfos().length;
    self.counterCarousel++;

    if (self.counterCarousel >= allImagesCount) {
        self.counterCarousel = 0;
        // ... add handlers here
    }
}

这是一种非常丑陋的做法。此外,用户可以添加/删除图像,因此每次添加或删除后都需要删除所有处理程序并重新连接。如何组织自定义绑定来处理这种情况?

4

1 回答 1

0

我不明白为什么这种方法行不通-

ko.utils.arrayForEach(ImageInfos(), function (image) {
    // ... add handlers here
});

或者更好的是,使用“图像信息”类将事件绑定到每个项目,这样您就不必在添加或更改项目时重做绑定 -

var afterRender = function (view) {
    bindEventToImages(view, '.image-info', doSomething);
};

var bindEventToImages= function (rootSelector, selector, callback, eventName) {
    var eName = eventName || 'click';
    $(rootSelector).on(eName, selector, function () {
        var selectedImage = ko.dataFor(this);
        callback(selectedImage);
        return false;
    });
};

function doSomething(sender) {
    alert(sender);
    // handlers go here
}

这将一个事件绑定到每个类'image-info'并且点击处理调用元素,执行doSomething。

于 2013-08-05T12:55:58.113 回答