2017-10-30 10 views
1

ノックアウトでフィールドを動的に作成しています。以下のコードは、テキストボックスまたはドロップダウン選択リストを作成します。入力フィールドは、私が購読しているプロパティ "Response"にバインドされています。ユーザーが選択リストを変更すると、どのタイプのコントロールが使用されているかを知りたい(たとえば、テキストボックスまたはドロップダウンリスト)。私の問題はノックアウトが私に間違ったタイプを常に伝えていることです。作成された最後のフィールドであるテキストボックス、:動的に購読イベントを作成する - ノックアウト

$(document).ready(function() { 

    var fields = [{ 
    "Label": "Enter The State", 
    "Length": 75, 
    "Type": "DropDownList", 
    "IsRequired": true, 
    "PreValue": "New York, New Jersey", 
    "Response": "" 
    }, { 
    "Label": "Enter Reason", 
    "Length": 75, 
    "Type": "DropDownList", 
    "IsRequired": true, 
    "PreValue": "Good,Bad,Ugly", 
    "Response": "" 
    }, { 
    "Label": "Enter City", 
    "Length": 75, 
    "Type": "TextBox", 
    "IsRequired": true, 
    "PreValue": "", 
    "Response": "" 
    }]; 

/* knockout */ 
function DynamicFormViewModel() { 
    var self = this; 
    self.fields = fields; 
    self.selectItem = function(value, text) { 
     this.value = value; 
     this.text = text; 
    }; 
    for (var i = 0; i < self.fields.length; i++) { 
     var field = self.fields[i]; 
     if (field.Type == 'TextBox') { 
     field.Response = ko.observable(field.PreValue); 
     } else if (field.Type === 'DropDownList') { 
     field.Items = []; 
     var itms = field.PreValue.split(","); 
     field.Items.push(new self.selectItem('', '--' + field.Label + '--')); 
     for (var s = 0; s < itms.length; s++) { 
      var sItem = new self.selectItem(itms[s], itms[s]); 
      field.Items.push(sItem); 
     } 
     field.Response = ko.observable(field.PreValue); 
     } else { 
     field.Response = ko.observable(field.PreValue); 
     } 
     field.Response.subscribe(function(newValue) { 
     if (newValue !== undefined && newValue != null && newValue.length > 0) { 
     alert(field.Type); 
     } 
     }); 
    }; 
    }; 
    var viewModel = new DynamicFormViewModel(); 
    ko.applyBindings(viewModel); 

}); 

ここでは、実施例である:参照は常に最後ですので、あなたのレスポンスのサブスクリプションでjsFiddle

答えて

2

変数「フィールドには、」周囲のループによって変更されていますループ内の項目。

"this"変数に使用するコンテキストで渡すようにサブスクリプション関数を変更し、代わりに使用することができます。

field.Response.subscribe(function(newValue) { 
    if (newValue !== undefined && newValue != null && newValue.length > 0) { 
    alert(this.Type); 
    } 
}, field); 
関連する問題