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プロパティを作成しました。type使用されていないファイル タイプのリストを埋めるには、プロパティの beforeChange およびその他の afterChange をサブスクライブします。

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. リストからファイル タイプを削除するtypesUnusedと、typesリストも変更される場合があります。

参照: 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 に答える