Javascript 如何防止Knockout.js函数在页面加载时运行?

Javascript 如何防止Knockout.js函数在页面加载时运行?,javascript,knockout.js,Javascript,Knockout.js,这是我正在使用的代码。控制台日志显示onFilterChange方法被调用了两次(在“选择标记”中的每个函数定义调用一次)。我猜我需要在数据绑定中更改“event:{change:onFilterChange}”,但我不熟悉Knockout.js,我们不支持ES6,所以不要使用“()=>onFilterChange”“这在过去对我很有用: 函数ProductionView(){ var self=这个; self.showDateFilter=ko.可观察(真); self.showCateg

这是我正在使用的代码。控制台日志显示onFilterChange方法被调用了两次(在“选择标记”中的每个函数定义调用一次)。我猜我需要在数据绑定中更改“event:{change:onFilterChange}”,但我不熟悉Knockout.js,我们不支持ES6,所以不要使用“()=>onFilterChange”“这在过去对我很有用:

函数ProductionView(){
var self=这个;
self.showDateFilter=ko.可观察(真);
self.showCategoryFilter=ko.可观察(真);
self.showDateFilter=ko.可观察(真);
self.onFilterChange=函数(数据、事件){
if(self.init()){
self.doFilter();
log(“调用了onFilterChange。在与筛选器交互之前,这在页面加载时发生两次。”);
}
};
self.doFilter=函数(){
var df=self.selectedDateFilter();
var cf=self.selectedCatFilter();
if(typeof cf==‘未定义’| | typeof df==‘未定义’){
返回;
}
//这些都被定义为可观察的,但并不重要,因为我不想调用“onFilterChange”
self.amFiltering(“All”!==df | |“All”!==cf);
self.allCatAndDate(“全部”==df&“全部”==cf);
自偏移量(0);
self.doa(true);
};
}
var pv=新产品视图();
ko.应用绑定(pv)

全部的
第一类
全部的
日期1

我猜是applyBindings本身在将初始值传递给select元素时触发了更改事件

您应该订阅模型中观察对象本身的更改事件,而不是标记中的事件绑定

self.selectedCatFilter.subscribe(onFilterChange);

self.selectedDateFilter.subscribe(onFilterChange);

是的,你使用击倒错误。Knockout是关于自动值依赖关系的,通常您根本不需要设置任何“更改”事件处理程序

您可以设置观察对象并订阅它们。当它们更改时,例如当用户更改绑定的UI元素时,或者当它们的某个依赖项更改时,您将收到通知

要订阅可观察值,只需在
计算的
中使用它们。subscribe()
直接订阅即可。二者如下所示。运行代码示例以查看其运行情况

函数ProductionView(){
var self=这个;
//价值观
self.selectedDateFilter=ko.可观察(“全部”);
self.selectedCatFilter=ko.可观察(“全部”);
//计算值
self.amFiltering=ko.computed(函数(){
返回self.selectedDateFilter()!=“全部”||
self.selectedCatFilter()!=“全部”;
});
self.allCatAndDate=ko.computed(函数(){
返回self.selectedDateFilter()=“全部”&&
self.selectedCatFilter()=“全部”;
});
//订阅
self.amFiltering.subscribe(函数(值){
console.log(“用filter=“+value”搜索);
//自过滤(值);
});
}
var pv=新产品视图();
ko.应用绑定(pv)

全部的
第一类
全部的
日期1
视图模型:

什么是selectedCatFilter和selectedDateFilter,可观察还是可计算?你能为这些显示代码吗?如果你不想让它在页面加载时运行,你想让它什么时候运行?您是否可以等待调用
applyBindings()
,直到该事件发生,然后使用该事件触发调用?@JasonSpake抱歉,我在中添加了这些可观察的声明@coralv是使用
applyBindings()
的好文档:我只希望在选择所需的过滤器时调用
onchange
。我会添加
applyBindings(self,document.getElementById(“日期结果”))