在淘汰赛中使用延迟评估对象绑定的问题

时间:2014-07-10 13:51:40

标签: javascript knockout.js

我有以下绑定

<ul data-bind="foreach: tubeRack.containers">
    <li data-bind="drop: { handler: $parent.dropHandler.bind(null, $index()) }">
    ...

问题是dropHandler.bind显然只在绑定中使用时才会被评估,这使得$index()总是返回 last 元素的索引。

我做错了什么,或者有没有办法让dropHandler绑定到列表中元素的每个索引?

drop绑定定义如下

ko.bindingHandlers.drop = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var self = this;

        var options = valueAccessor();
        self.accept = options.accept || _.constant(true);
        self.handler = options.handler;

        $(element).droppable({
            tolerance: 'pointer',
            accept: function (draggable) {
                return self.accept(dragData);
            },
            drop: function(evt, ui) {
                self.handler(dragData);
            }
        });
    }
};

2 个答案:

答案 0 :(得分:0)

答案是绑定保持对this的愚蠢引用并在其上设置处理函数,导致handler变量被覆盖。

答案 1 :(得分:0)

由于index()属于foreach,因为您已经正确识别,因此在评估该foreach期间,它只会具有正确的值。因此,我建议采取以下解决方法来强制及时进行评估。不幸的是,我无法测试它,但它至少应该能够作为一个暗示:

<li data-bind="drop: { handler: (function(idx) { $parent.dropHandler.bind(null, idx); })($index()) }">