更新: JSFiddle http://jsfiddle.net/OrganicCat/CjH87/6/
我有一个由普通可观察数组填充的区域,当单击一个按钮时,会进行异步服务调用,重新填充该数组,但数据更多。
这也会导致隐藏的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.listofStuff(arr);)时,这会导致新区域再次被隐藏。
答案 0 :(得分:0)
我找到了答案。所以问题在于,如果绑定一个生成DOM元素的数组(如列表或其他),并且您希望在不执行.push的情况下更新该数组中的元素,并且不使用self.myArray重置整个数组(newArray) )然后你必须在数组中使用一个可观察的变量并更新它。
当您修改observable时,它不会重绘整个数组,从而将动态更改的元素(如DOM数组中的可见/隐藏div)保持在相同状态(如果它们被jQuery或其他任何内容更改)。