ko.observable正在更新两次

时间:2012-02-20 21:57:53

标签: knockout.js

我的视图模型具有很少的可观察属性,我使用它们来存储来自下拉列表的值,基本上就像这里解释的购物车示例一样。

knockoutjs 'Cart editor' example questions

这是我的HTML 1)选择boardtest 2)为每个部分选择分数

<select data-bind="options :$parent.boardTestData,optionsText:'name', value:boardTestSelected, optionsCaption:'Select Test' ">     </select>
   <div data-bind="visible : boardTestSelected, foreach : boardTestSelected() ? boardTestSelected().testParts : null">
   <div>
        <span  data-bind="text: boardTestPartName"></span>
        <select data-bind="options: testPartValues, optionsText:'BoardTestPartValue',
         value: $parent.testPartValueSelected> </select>   
   </div>
   </div>

我的视图模型有

$ parent.boardTestData是一个obervablearray(),其数组类型为testParts [] 和testParts包含另一个数组testPartValues []

class @BoardTestData
    constructor :(data) ->
        @id = data.Id
        @name = data.Name
        @testParts = []
        @testParts.push new TestParts data.Name,d for d in data.TestParts

class @TestParts
    constructor:(partData) ->
        @testPartValues = []
class @TestPartValues
    constructor:(partValues) ->                 
        @BoardTestPartValueId= partValues.Id
        @BoardTestPartValue = partValues.Value      


@boardTestSelected = ko.observable()
@testPartSelected = ko.observable()
@testPartValueSelected =  ko.observable()

我已经订阅了testPartValueSelected,并且它首次使用正确的值执行两次,然后是witj null值,所以我认为有一些东西将@testPartValueSelected设置为null或undefined。

  • 当foreach中只有一个项目用于嵌套下拉列表
  • 时,它会以某种方式正常工作

虽然我这样做的另一个问题是我可以将选定的值从下拉列表推送到数组或obersvable数组()?

为此问题设置JS小提琴:http://jsfiddle.net/paisley/W82yE/11/

1 个答案:

答案 0 :(得分:0)

当您给@BoardTestData一个值时,会触发订阅。这是因为knockout会自动将下拉列表的value分配给第一个值。您已将值设置为testpartvalueselected变量,以便设置。

稍后再次将其设置为新的ko.observable()。 knockout再次检测到更改并点击订阅。

将值分配给下拉列表时,无需手动设置相应的“选定”值。它已经为你设定了。