通过手动订阅重置下拉列表不起作用,具体取决于订阅的可观察对象

时间:2014-04-28 19:47:38

标签: knockout.js

我在网上搜索并试图仔细思考并理解这种行为,但我仍然无法弄清楚为什么这是行为。可能是我错过了一些基本的东西吗?

我很欣赏一些指针/资源/答案。

考虑这个小提琴 - 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);
});

1 个答案:

答案 0 :(得分:0)

它与subscribe事件相对于其他computed属性的调用顺序有关。 Computedsubscribe d属性的调用顺序与观察属性发生更改时的顺序相同。以下是每种情况下发生的事情的基本时间表,尽我所知(没有读过剑道来源,所以有一些猜测):

<强> category.subscribe:

  1. 用户操纵类别下拉列表,设置新值
  2. categoryName observable由knockout
  3. 更新 由于category 的更改,
  4. categoryName计算属性已更新 由于product

    的更改,
  5. category计算属性已更新

    注意:此时productName仍然是旧值

  6. 调用
  7. category.subscribe事件,更改productName
  8. 的值 由于product

    的更改,
  9. productName计算属性已更新

    注意:productName现在是undefined

  10. 所有相关的计算属性和订阅的事件都已在category上完成,因此kendoDropDownList会根据新的products列表和当前的{undefined)值更新productName {1}}
  11. <强> categoryName.subscribe:

    1. 用户操纵类别下拉列表,设置新值
    2. categoryName observable由knockout
    3. 更新 由于category 的更改,
    4. categoryName计算属性已更新 由于product

      的更改,
    5. category计算属性已更新

      注意:此时productName仍然是旧值

    6. 所有依赖计算属性和订阅事件都已在category上完成,因此kendoDropDownList会根据新products列表和当前( undefined)值productName

      我测试了kendoDropDownList,即使您将productName设置为像'asdf'这样的虚拟字符串,它也会选择第一个选项。如果值为空字符串('')或undefined,则仅显示为空白。

    7. 调用
    8. categoryName.subscribe事件,更改productName
    9. 的值 由于product

      的更改,
    10. productName计算属性已更新

      注意:productName现在是undefined

    11. category 再次更新,因为它不依赖于productproductName,但kendoDropDownList应更新,但没有。

      进一步测试后,kendoDropDownList只有在首次创建下拉列表时值为undefined''时才会显示为空白(在此示例中,&#39;在步骤5)中。如果您向optionLabel添加kendoDropDownList参数,它将按预期工作。


    12. 如果您在categoryName.subscribe之前放置category = ko.computed(...),那么在整个周期开始之前productName将设置为undefined,这将是一种解决方法它。这是一个小提琴:http://jsfiddle.net/6Z6TW/

      另一种方法是在optionLabel选项哈希中添加kendoDropDownList参数,如步骤8中所述。