繁体   English   中英

更改可观察数组会更改自定义绑定处理程序的敲除可见性

[英]Changing observable array alters visibility of custom binding handler, knockoutjs

更新: JSFiddle http://jsfiddle.net/OrganicCat/CjH87/6/

我有一个由普通可观察数组填充的区域,单击按钮后,将进行异步服务调用,以重新填充该数组,但包含更多数据。

这还会导致显示一个隐藏的dom元素,并在其中显示该数组数据中的某些数据。

一切正常,直到可观察的数组数据更新,它关闭了隐藏的dom元素。 触发它的是Knockout.js(library)中的此事件:

// Ignore writes if the value hasn't changed
    if ((!observable['equalityComparer']) || !observable['equalityComparer'](_latestValue, arguments[0])) {
    observable.valueWillMutate();
    _latestValue = arguments[0];
    if (DEBUG) observable._latestValue = _latestValue;
    observable.valueHasMutated(); // This event HERE

有没有办法防止这种情况关闭自定义绑定? 绑定中的任何内容可能会导致这种情况吗? 这是我的自定义绑定处理程序:

ko.bindingHandlers.expandAmenities = {
                init: function (element) {
                    $('.expandable.closed').hide();
                    $('.itineraryRowMain .t-go .toggle-expand-rowAmenities').unbind('click').on('click', function (e) {

                        var $itin_body = $(this).closest('.module-admin-group');
                        if ($itin_body.hasClass('closed')) {
                            $(this).parent().parent().next().show();
                            self.bindAmenities(); // Bind amenity details on open
                            //$(this).children().html('-');
                        } else {
                            $(this).parent().parent().next().hide();
                            //$(this).children().html('+');
                        }
                        $itin_body.toggleClass('open closed');
                    });
                }
            };

总而言之,扩展区域具有可单击的元素,它将显示更多数据。 当这更新数组时(只是一个普通的旧self.listofStuff(arr);),这将导致新区域再次被隐藏。

我已经找到答案了。 因此,问题在于,如果您绑定一个生成DOM元素的数组(如列表或其他内容),并且该数组中有要更新的元素,而无需执行.push且无需使用self.myArray(newArray ),则必须在数组中使用可观察变量并对其进行更新。

当您修改可观察对象时,它不会重绘整个数组,从而使动态更改的元素(例如DOM数组中的可见/隐藏的div)保持相同的状态(如果通过jQuery或其他方式对其进行了更改)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM