【发布时间】:2016-02-15 23:00:30
【问题描述】:
我希望这只是我有点修剪,但是当我不希望更改事件触发时,我遇到了麻烦。我会尽量保持简短和清晰。
我有两个下拉菜单,国家和城市。两者的约束如下:
<select data-bind="options: Countries, event: { change: IChanged }, value: CountrySelected">
<select data-bind="options: Cities, event: { change: IChanged }, value: CitySelected">
我的小视图模型
self.Countries = ko.observableArray([]);
self.Cities = ko.observableArray([]);
self.CountrySelected = ko.observable();
self.CitySelected = ko.observable();
现在我的函数IChanged()
self.IChanged = function(item) {
GoGetMyOptions().done(function(response) {
self.Cities(response);
});
}
问题!
调用self.Cities(response);时会触发City下拉菜单的change事件,这意味着下拉菜单会再次调用该方法。
警告
我已经简化了这个,我可以有 1 到 80 个过滤器。在我的代码中,我基本上开始加载右侧所有内容的下拉选项,问题是它为右侧所有内容调用更改事件:O Ideas any?
一个更复杂的例子(接近我的代码
我其实有一个过滤器集合,self.FilterCollection,每个过滤器都有以下内容:
self.DropDownValues = ko.observableArray([]);
self.SelectedValue = ko.observable();
You can see that when a drop down is selected, it updates the selected value and THEN refreshed the DropDownValues array for all filters to the right.
在一个相当尴尬的场景中,
- 用户选择了一个城市
- 他们选择了一个国家
- CITY 列表已更新
- 因此重置当前值**
我相信数字 4 会触发订阅...
一个完整的场景
有 4 个下拉菜单,A、B、C 和 D。
当用户从 A 中选择一个值时,我将遍历剩余的下拉菜单并调用 getValues,然后这将更新 DropDownValues 可观察对象。
因此,我希望 1 UI 事件触发说“用户更改了下拉 a”,然后我需要进行 3 ajax 调用来加载 B、C和 D 并更新可观察数组。
我的问题是,当用户选择 A 时,它会正确地进行 3 次 ajax 调用,但是在设置 B 的值时会触发事件...
这意味着 B 将进行 2 次 ajax 调用来更新 C 和 D。因此,当用户在下拉 A 中选择某些内容时,它实际上会触发:
1 个 UI 事件,3 个 Ajax 调用,1 个 UI 事件,2 个 ajax 调用,1 个 UI 事件,1 个 ajax 调用,然后是一个最终的 UI 事件。总而言之,用户一键进行 4 次 UI 事件调用和 6 次 ajax 调用 :(
【问题讨论】:
-
您的问题中没有冒号的
event {...}是错字吗? -
是的,我应该说,该活动完美无缺。不幸的是,当我选择一个国家时,事件会触发两次......
-
你为什么不订阅
CountrySelected? -
我稍微扩展了我的问题:)
-
所以如果我理解正确,你的问题是当你选择一个下拉菜单时你有一个无限循环?限制您的可观察量的速率怎么样?或者某种锁定机制来指定您的 observable 刚刚被触发并且不需要再次触发?
标签: javascript jquery knockout.js