2

KnockoutJS を使用して、配列からリストを作成します。

<div data-bind:"foreach: list">
   <input type="text" data-bind="value: myText" />
</div>

function ViewModel() {
    self.list = ko.observableArray([
        new listItem("sample text")
    ]);
};

function listItem (text) {
    this.myText = text;
};

次のように、入力の個々のインスタンスにIDを割り当てることができます

<input data-bind="attr: { id: $index } ...

listItem 関数内からこのインデックスにアクセスするにはどうすればよいですか? みたいなことができるようになりたい

function listItem (text) {
    this.myText = text;
    this.index = $index;
};

これをさらに処理するために使用します。

4

1 に答える 1

14

プロパティをインデックスに設定するカスタム バインディングを作成できます。次のようになります。

ko.bindingHandlers.setIndex = {
    init: function(element, valueAccessor, allBindings, data, context) {
        var prop = valueAccessor();
        data[prop] = context.$index;
    }        
};

これは、配列内のオブジェクトを扱っていることを前提としています。次のように使用します。

<ul data-bind="foreach: items">
    <li data-bind="setIndex: 'myIndex', text: name"></li>
</ul>

したがって、これにより$index、指定したプロパティ名でオブザーバブルがオブジェクトにコピーされます。サンプル: http://jsfiddle.net/rniemeyer/zGmcg/

バインディングの外でこれを行う別の方法 (これは私が以前に行っていた方法です$index) は、observableArray への変更をサブスクライブし、毎回インデックスを再作成することです。

observableArray の拡張は次のようになります。

//track an index on items in an observableArray
ko.observableArray.fn.indexed = function(prop) {
    prop = prop || 'index';
   //whenever the array changes, make one loop to update the index on each
   this.subscribe(function(newValue) {
       if (newValue) {
           var item;
           for (var i = 0, j = newValue.length; i < j; i++) {
               item = newValue[i];
               if (!ko.isObservable(item[prop])) {
                  item[prop] = ko.observable();
               }
               item[prop](i);      
           }
       }   
   }); 

   //initialize the index
   this.valueHasMutated(); 
   return this;
};

次に、次のように使用します。

this.myItems = ko.observableArray().indexed('myIndexProp');

サンプルは次のとおりです: http://jsfiddle.net/rniemeyer/bQD2C/

于 2012-09-01T18:10:04.863 に答える