2

在我的视图模型中有一个文件列表、文件类型和未使用的文件类型:

viewModel =
  files: ko.observableArray([
        new File({name: "A1", id: 1})
        new File({name: "B1", id: 2})
        new File({name: "C1", id: 3})
        new File({name: "D1", id: 4})
    ])
  types:  ko.observableArray(dataTypes)
  typesUnused: ko.observableArray(dataTypes)

我创建了一个File类,并在其中创建了一个type属性。要填写未使用的文件类型列表,请订阅 beforeChange 和其他 afterChangetype属性

class File
  constructor: (data) ->
    @name = data.name
    @id = data.id
    @type = ko.observable(null)

    # Updates array of types not used
    @type.subscribe ((oldValue) ->
      console.log "OLD: #{oldValue}"
      viewModel.typesUnused.remove (item) -> item is oldValue if oldValue
    ), @, "beforeChange"
    @type.subscribe (newValue) ->        
      console.log "NEW: #{newValue}"
      if newValue && viewModel.typesUnused.indexOf(newValue) < 0 
        viewModel.typesUnused.push newValue

想法
想法是每当您更改文件类型时,都会在更改发生之前触发一个事件,并将旧类型添加到未使用的文件类型列表中。更改后将发生另一个事件,该事件将从未使用的类型列表中删除新类型。

问题

  1. 所有文件都带有定义的文件类型数组中的第一种类型。在这种情况下,“jpeg”
  2. 通过更改文件类型,所有其他人都会遭受更改!
  3. 当您从列表中删除文件类型时typesUnusedtypes列表也可能会更改!

见:http: //jsfiddle.net/4nyVE/2/

4

1 回答 1

2

您的问题是您的typestypesUnused使用相同的数组初始化dataTypes。当项目从中删除时也会typesUnused影响types,因为它们包含对同一数组的引用。

此时,其他选择中当前选择的选项不再有效(不再在 中types),因此将值设置为第一选择。

您最好的选择可能是typesUnused使用原始数组的副本进行初始化(这myarray.slice(0)是一种简单的复制方法),例如:

typesUnused: ko.observableArray(dataTypes.slice(0))
于 2012-12-07T03:12:34.607 回答