我在网上搜索并试图仔细思考并理解这种行为,但我仍然无法弄清楚为什么这是行为。可能是我错过了一些基本的东西吗?
我很欣赏一些指针/资源/答案。
考虑这个小提琴 - http://jsfiddle.net/rniemeyer/e3cTT/
为什么会重置产品选择
// Whenever the category changes, reset the product selection
self.category.subscribe(function() {
self.productName(undefined);
});
虽然这不是吗?
// Whenever the category changes, reset the product selection
self.categoryName.subscribe(function() {
self.productName(undefined);
});
答案 0 :(得分:0)
它与subscribe
事件相对于其他computed
属性的调用顺序有关。 Computed
和subscribe
d属性的调用顺序与观察属性发生更改时的顺序相同。以下是每种情况下发生的事情的基本时间表,尽我所知(没有读过剑道来源,所以有一些猜测):
<强> category.subscribe:强>
categoryName
observable由knockout category
的更改,categoryName
计算属性已更新
由于product
的更改, category
计算属性已更新
注意:此时productName
仍然是旧值
category.subscribe
事件,更改productName
product
的更改, productName
计算属性已更新
注意:productName
现在是undefined
category
上完成,因此kendoDropDownList
会根据新的products
列表和当前的{undefined
)值更新productName
{1}} <强> categoryName.subscribe:强>
categoryName
observable由knockout category
的更改,categoryName
计算属性已更新
由于product
的更改, category
计算属性已更新
注意:此时productName
仍然是旧值
所有依赖计算属性和订阅事件都已在category
上完成,因此kendoDropDownList
会根据新products
列表和当前(不 undefined
)值productName
我测试了kendoDropDownList
,即使您将productName
设置为像'asdf'
这样的虚拟字符串,它也会选择第一个选项。如果值为空字符串(''
)或undefined
,则仅显示为空白。
categoryName.subscribe
事件,更改productName
product
的更改, productName
计算属性已更新
注意:productName
现在是undefined
category
不再次更新,因为它不依赖于product
或productName
,但kendoDropDownList
应更新,但没有。
进一步测试后,kendoDropDownList
只有在首次创建下拉列表时值为undefined
或''
时才会显示为空白(在此示例中,&#39;在步骤5)中。如果您向optionLabel
添加kendoDropDownList
参数,它将按预期工作。
如果您在categoryName.subscribe
之前放置category = ko.computed(...)
,那么在整个周期开始之前productName
将设置为undefined
,这将是一种解决方法它。这是一个小提琴:http://jsfiddle.net/6Z6TW/
另一种方法是在optionLabel
选项哈希中添加kendoDropDownList
参数,如步骤8中所述。