Javascript 更改可观察数组会改变自定义绑定处理程序knockoutjs的可见性

Javascript 更改可观察数组会改变自定义绑定处理程序knockoutjs的可见性,javascript,arrays,knockout.js,Javascript,Arrays,Knockout.js,更新:JSFiddle 我有一个由普通可观察数组填充的区域,当单击一个按钮时,会发出一个异步服务调用,该调用会重新填充该数组,但会包含更多数据 这还会导致显示隐藏的dom元素,并在其中显示一些数组数据 一切正常,直到可观察数组数据更新,它关闭隐藏的dom元素。触发它的是Knockout.js(库)中的这个事件: // Ignore writes if the value hasn't changed if ((!observable['equalityComparer']) || !ob

更新:JSFiddle

我有一个由普通可观察数组填充的区域,当单击一个按钮时,会发出一个异步服务调用,该调用会重新填充该数组,但会包含更多数据

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

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

// 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.listofsuff(arr);)时,这会导致新区域再次隐藏。

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


当您修改observable时,它不会重新绘制整个数组,从而保持动态更改的元素(如DOM数组中的可见/隐藏div)在相同的状态下,如果它们被jQuery或任何更改。

似乎是一个非常具体的问题,你应该考虑创建一个JScDeldle来复制这个问题,这样其他人就可以看到可能导致你的问题的原因。当对元素进行更改时,它会将DOM重绘到初始状态。我在顶部加了一把小提琴