我一直在尝试创建一个自定义绑定来更新浮动图表,它似乎在它第一次加载时可以工作,但是当我浏览它时它退出了。
这是场景,我在一个页面上有一个列表视图(这是在 jQuery Mobile 中),带有小图的缩略图,图旁边是一个滑块,它绑定到同一视图模型的属性,导致图指向被重新计算。当您单击其中一个列表项时,它会移动到显示更大版本的图表的另一个页面,并允许您通过在文本框中键入来更改值(稍后,您将能够直接单击图表) . 绑定看起来像这样:
ko.bindingHandlers["plot"] = {
init: function (element, valueAccessor, allBindingsAccessor) {
var qe = $(element);
var page = qe.closest("div[data-role='page']");
page.bind("pageshow", function () {
ko.bindingHandlers["plot"].update(element, valueAccessor);
});
},
update: function (element, valueAccessor, allBindingsAccessor) {
var qe = $(element);
var page = qe.closest("div[data-role='page']");
var curr = $.mobile.activePage;
var val = ko.utils.unwrapObservable(valueAccessor());
var data = val.plotData();
if(data && page.prop("id") == curr.prop("id")) {
var marker = val.markerData();
var opt = val.chartOptions();
opt.yaxis.show = opt.xaxis.show = !qe.hasClass("graphThumb");
marker.points.radius = opt.yaxis.show ? 5 : 3.5;
$.plot(qe, [
data,
marker
], opt);
}
}
};
处理程序将其init
设置为在页面显示上绘制图形,因为 flot 在绘制到不可见时无法正常工作div
。更新将检查当前显示的页面是否与绑定的页面相同,并根据需要重新绘制图形。
对于列表视图中的图形,它们会立即通过该update
方法绘制并正常工作。但是,对于最初隐藏的页面,绘制图形的功能会触发,图形绘制,但更新将不再起作用。然后,更糟糕的是,当您返回初始页面时,绑定到pageshow
事件的函数会触发,重新绘制图形,但现在它们也退出了更新。
视图模型看起来像这样:
var viewModel = (function () {
this.current = ko.observable(0);
this.plotData = ko.computed(function () {
var points = [];
// a bunch of calculations that depend on the value of current of this and other viewModels in a collection
return points;
}
}
我可以在计算中设置一个断点plotData
并查看它是否正确更新。只是这些更新不会触发绑定处理程序。
HTML 绑定看起来像这样:
<!-- the first, visible page -->
<div data-role="page" id="index">
<ul data-role="listview" data-bind="foreach: factors">
<li data-bind="attr: {id: listId}">
<a data-bind="attr: {href: idLink}">
<div class="graphThumb" data-bind="plot: $data"></div>
</a>
</li>
</ul>
</div>
<!-- hidden details pages -->
<!-- ko foreach: factors -->
<div data-role="page" data-bind="attr: { id: id }">
<div class="graphPlaceHolder" data-bind="plot: $data"></div>
</div>
<!-- /ko -->
更新:我稍微改变了我的绑定,因为我意识到我可以调用update
事件pageshow
处理程序,这简化了事情,但没有解决问题。似乎这样做不会使淘汰赛更新它对绑定的依赖项。
更新:另一个更新,分配val.plotData()
给一个变量没有工作,也没有包括在我的if
声明中。但是,我有另一个计算的 observable,它取决于current
父视图模型的值和另一个属性,我可以检索并添加到我的if
有效语句中!但是,我的解决方案可能具体到通常有用。简短的故事是,淘汰赛将在每次更新时重新评估绑定的依赖关系,因此您需要确保它正在评估重要的东西,而不考虑任何条件逻辑,否则它将停止更新。