更改可观察数组会更改自定义绑定处理程序knockoutjs的可见性
Changing observable array alters visibility of custom binding handler, knockoutjs
更新:JSFiddlehttp://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);)这会导致新区域再次被隐藏。
我已经找到了答案。因此,问题是,如果绑定了一个生成DOM元素(如列表或其他)的数组,并且该数组中有要更新的元素,而不需要执行.push操作,也不需要使用self.myArray(newArray)重置整个数组,那么就必须在数组中使用一个可观察变量并更新它。
当您修改observable时,它不会重新绘制整个数组,从而使您的动态更改的元素(如DOM数组中的可见/隐藏div)处于相同的状态(如果它们被jQuery或其他什么更改的话)。
相关文章:
- 如何使用url加载程序在webpack中导入多个图像
- keyup事件处理程序更改焦点不适用于快速键入
- 用程序搜索JQuery数据表中的文本
- Javascript:selenium Web驱动程序isDisplayed()不工作
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- knockoutjs可观察数组
- ExtJS 5用程序点击actioncolumn gridview
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 如何从Java/scala调用js美化程序
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 用于动态引导工具提示的自定义KnockoutJS绑定处理程序
- 更改可观察数组会更改自定义绑定处理程序knockoutjs的可见性
- KnockoutJS处理引导程序日期选择器和日期格式
- KnockoutJS - 引导程序 3 模式绑定不起作用
- 在 KnockoutJS 应用程序中将 AngularJS 应用程序作为 iFrame 加载
- KnockoutJS双绑定小部件应用程序
- 在knockoutjs中绑定两次自定义处理程序
- 如何在knockoutjs中绑定点击处理程序到模板,而不需要全局视图模型