【发布时间】:2017-06-13 19:51:18
【问题描述】:
这是我正在使用的代码。控制台日志显示 onFilterChange 方法被调用了两次(对于“选择标签”中的每个函数定义一次)。我猜我需要在数据绑定中更改“事件:{ change:onFilterChange }”,但是我不熟悉 Knockout.js,而且我们不支持 ES6,所以不要使用过去对我有用的“()=>onFilterChange”:
function ProductionsView() {
var self = this;
self.showDateFilter = ko.observable(true);
self.showCategoryFilter = ko.observable(true);
self.showDateFilter = ko.observable(true);
self.onFilterChange = function(data,event) {
if (self.init()) {
self.doFilter();
console.log("onFilterChange was called. This is happening twice on page load before interacting with the filter. ");
}
};
self.doFilter = function() {
var df = self.selectedDateFilter();
var cf = self.selectedCatFilter();
if (typeof cf == 'undefined' || typeof df == 'undefined') {
return;
}
// these are all defined as observables too, but not important since it's the "onFilterChange" that I don't want to call
self.amFiltering("All" !== df || "All" !== cf);
self.allCatAndDate("All" === df && "All" === cf);
self.offset(0);
self.doAjaxSearchFiltered(true);
};
}
var pv = new ProductionsView();
ko.applyBindings(pv);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div data-bind="visible: showDateFilterBar()">
<select data-bind="
value: selectedCatFilter,
event: { change: onFilterChange },
visible: showCategoryFilter()
">
<option value="all">all</option>
<option value="cat1">cat1</option>
</select>
<select data-bind="
value: selectedDateFilter,
event: { change: onFilterChange },
visible: showDateFilter()
">
<option value="all">all</option>
<option value="date1">date1</option>
</select>
</div>
【问题讨论】:
-
什么是 selectedCatFilter 和 selectedDateFilter,可观察的还是计算的?你能显示这些代码吗?
-
如果您不希望它在页面加载时运行,您希望它何时运行?您能否等到该事件发生后再致电
applyBindings(),然后使用该事件触发呼叫? -
@JasonSpake 抱歉,我在其中添加了那些可观察的声明。@coralv 是使用
applyBindings()的好文档:stackoverflow.com/questions/18990244/… 我只希望在选择哪个过滤器时调用该方法onchange一想。我要加applyBindings(self, document.getElementById("date-results") )吗?