7

我正在使用 jquery quicksearch 来搜索由淘汰赛 foreach 循环填充的表。快速搜索元素需要在 foreach 完成后启动。我尝试了几种方法,但到目前为止都没有成功。

我尝试使用'afterRender',但无法确定当前项目是否是集合中的最后一个项目,我也尝试使用 bindingHandlers,但后来我得到了一个长度为 0 而不是长度为 2005 的集合。

所以:

  1. 在 foreach 循环中找到最后一个元素的最佳方法是什么?
  2. 在这种特定情况下实施它的最佳方法是什么?

这是我的看法:

    <tbody data-bind="foreach: containers">
        <tr>
            <td><span data-bind="text: code"></span></td>
            <td><span data-bind="text: typeName"></span></td>
            <td><span data-bind="text: parentClient"></span></td>
            <td><span data-bind="text: client"></span></td>
            <td>
                <a data-bind="attr: { onclick: deleteUrl }">
                    <i class="icon-trash"></i>@delete </a>
                |
                <a data-bind="attr: { href: editUrl }">
                    <i class="icon-edit"></i>@edit</a>
                |
                <a data-bind="attr: { href: qrUrl }" target="blank">
                    <i class="icon-qrcode"></i>
                    @printQr
                </a>
            </td>

        </tr>
    </tbody>

这是我的淘汰赛代码:

function Container(data) {
        var self = this;
        self.id = ko.observable(data.Id);
        self.code = ko.observable(data.Code);
        self.typeName = ko.observable(data.TypeName);
        self.parentClient = ko.observable(data.ParentClient);
        self.client = ko.observable(data.Client);
        self.deleteUrl = ko.computed(function () {
            return "GetModal('/Containers/Delete/" + data.Id + "','containerModal');";
        });
        self.editUrl = ko.computed(function () {
            return '/Containers/Edit/' + data.Id;
        });

        self.qrUrl = ko.computed(function () {
            return '/Qr/Index/10?entity=' + data.Id;
        });
    }
 function ContainersViewModel() {
        var self = this;
        self.containers = ko.observableArray([]);
        self.counter = ko.computed(function () {
            return self.containers().length;
        });

        $.getJSON("/Containers/Json", function (data) {
            var containers = $.map(data, function (item) {
                return new Container(item);
            });

            self.containers(containers);
        });

    };
    ko.applyBindings(new ContainersViewModel());

非常感谢 !

尼尔

4

5 回答 5

4

foreach 绑定 afterRender 选项可以完成您要查找的操作,技巧部分是能够知道该元素是最后一个。这可以使用提供的参数来解决,如http://jsfiddle.net/n54Xd/中所示。

功能:

this.myPostProcessingLogic = function(elements, data) {
    if(this.foreach[this.foreach.length-1] === data)
        console.log("list is rendered");
};

将为每个元素调用,但“if”将确保代码仅针对最后一个元素运行。

于 2013-05-05T21:16:21.330 回答
2

尝试手动订阅阵列更改。通过使用订阅,您将收到有关数组修改的通知。

如果您在 applyBindings 调用后订阅,您将在视图刷新过程后收到通知。

见小提琴

var ViewModel = function () {
    var self = this;

    self.list = ko.observableArray();

    self.add = function () {
        self.list.push('Item');
    }
    self.list.subscribe(function () {
        alert('before');
    });
};
var vm = new ViewModel();
ko.applyBindings(vm);

vm.list.subscribe(function () {
    alert('after');
});

我希望它有所帮助。

于 2013-05-05T15:22:14.180 回答
2

只需稍作调整,我就成功地使用了 Ricardo Medeiros Penna 的答案。

    this.myPostProcessingLogic = function(elements, data) {
      if(this.foreach._latestValue[this.foreach._latestValue.length-1] === data)
        console.log("list is rendered");
    };

我必须添加 _latestValue 来获取长度值,现在它可以按需要工作。

于 2017-06-14T13:38:22.963 回答
1

使用油门扩展器,这种方式计算将在您完成填充数组后调用一次:

  self.counter = ko.computed(function () {
        return self.containers().length;
    }).extend({ throttle: 100 });
于 2013-05-05T21:08:06.817 回答
1

迟到的附录,但上面里卡多回答中的 if 语句应该是:

if (this.foreach()[this.foreach().length - 1] === data) {
    //Your post processing logic
}

因为 foreach 是一个函数。很可能为什么 Nir ​​Weiner 对它的评估有问题。

于 2018-04-26T16:44:44.877 回答