knockoutjs 웹 사이트에서 샘플을 찾았습니다. 여기서는 다중 선택 목록 상자에 값을 바인딩합니다. 그러나 그들은 매우 간단한 관측 가능한 배열을 사용하고 있습니다. 사용할 수있는 나라 및 선택한 국가.knockoutjs 복합 배열 복수 선택 목록 상자에서 데이터 바인딩
<p>
Choose some countries you'd like to visit:
<select data-bind="options: availableCountries, selectedOptions: chosenCountries" size="5" multiple="true"></select>
</p>
<script type="text/javascript">
var viewModel = {
availableCountries : ko.observableArray(['France', 'Germany', 'Spain']),
chosenCountries : ko.observableArray(['Germany']) // Initially, only Germany is selected
};
// ... then later ...
viewModel.chosenCountries.push('France'); // Now France is selected too
</script>
하지만 내 모델이 너무 복잡하여 모델의 일부를 json 형식으로 언급했습니다. 여기
"JobOrderDelivTranscript" : [{
"TranscriptType" : {
"Id" : 1,
"Name" : null,
"CreatedBy" : 0,
"CreatedDate" : "0001-01-01T00:00:00",
"ModifiedBy" : 0,
"ModifiedDate" : "0001-01-01T00:00:00",
"IsActive" : false,
"EntityStatus" : 0,
"ErrorMessage" : null,
"ExternalID" : 0,
"ExternalSystemID" : 0
},
"Id" : 1,
"Name" : null,
"CreatedBy" : 0,
"CreatedDate" : "0001-01-01T00:00:00",
"ModifiedBy" : 0,
"ModifiedDate" : "0001-01-01T00:00:00",
"IsActive" : false,
"EntityStatus" : 0,
"ErrorMessage" : null,
"ExternalID" : 0,
"ExternalSystemID" : 0
}, {
"TranscriptType" : {
"Id" : 2,
"Name" : null,
"CreatedBy" : 0,
"CreatedDate" : "0001-01-01T00:00:00",
"ModifiedBy" : 0,
"ModifiedDate" : "0001-01-01T00:00:00",
"IsActive" : false,
"EntityStatus" : 0,
"ErrorMessage" : null,
"ExternalID" : 0,
"ExternalSystemID" : 0
},
"Id" : 2,
"Name" : null,
"CreatedBy" : 0,
"CreatedDate" : "0001-01-01T00:00:00",
"ModifiedBy" : 0,
"ModifiedDate" : "0001-01-01T00:00:00",
"IsActive" : false,
"EntityStatus" : 0,
"ErrorMessage" : null,
"ExternalID" : 0,
"ExternalSystemID" : 0
}
]
내 "chosenCountries"JobOrderDelivTranscript됩니다(). 첫 번째 옵션을 선택하면 JobOrderDelivTranscript() [0] .TranscriptType.Id와 매핑되어야합니다. 그들의 예제에서는 문자열 배열을 사용하고 있지만 복잡한 데이터를 바인딩해야합니다. 어떻게해야합니까?
심지어 내가 선택받을 수있는 옵션을 만들었습니다하지만 JSON 데이터가 업데이트 점점되지ko.bindingHandlers['selectedCustomOptions'] = {
getSelectedValuesFromSelectNode: function (selectNode) {
var result = [];
var nodes = selectNode.childNodes;
for (var i = 0, j = nodes.length; i < j; i++) {
var node = nodes[i], tagName = ko.utils.tagNameLower(node);
if (tagName == "option" && node.selected)
result.push(ko.selectExtensions.readValue(node));
else if (tagName == "optgroup") {
var selectedValuesFromOptGroup = ko.bindingHandlers['selectedCustomOptions'].getSelectedValuesFromSelectNode(node);
Array.prototype.splice.apply(result, [result.length, 0].concat(selectedValuesFromOptGroup)); // Add new entries to existing 'result' instance
}
}
return result;
},
'init': function (element, valueAccessor, allBindingsAccessor) {
ko.utils.registerEventHandler(element, "change", function() {
var value = valueAccessor();
var valueToWrite = ko.bindingHandlers['selectedCustomOptions'].getSelectedValuesFromSelectNode(this);
ko.jsonExpressionRewriting.writeValueToProperty(value, allBindingsAccessor, 'value', valueToWrite);
});
},
'update': function (element, valueAccessor) {
if (ko.utils.tagNameLower(element) != "select")
throw new Error("values binding applies only to SELECT elements");
var newValue = ko.utils.unwrapObservable(valueAccessor());
if (newValue && typeof newValue.length == "number") {
var nodes = element.childNodes;
for (var i = 0, j = nodes.length; i < j; i++) {
var node = nodes[i];
if (ko.utils.tagNameLower(node) === "option")
ko.utils.setOptionNodeSelectionState(node, arrayIndexOf(newValue, ko.selectExtensions.readValue(node)) >= 0);
}
}
}
};
function arrayIndexOf (array, item) {
if (typeof Array.prototype.indexOf == "function")
return Array.prototype.indexOf.call(array, item);
for (var i = 0, j = array.length; i < j; i++)
if (array[i].TranscriptType.Id() === item.Id)
return i;
return -1;
}
사용자 정의 바인딩했습니다.
간단한 방법이 있습니까?
미리 감사드립니다.
빠른 답장을 보내 주셔서 감사합니다. jsfiddle [link] http://jsfiddle.net/nanda/uVjUv/1/에서 샘플 애플리케이션을 찾으십시오. 매핑 모델을 사용하고 있습니다. 나는 여러개의 joborder를 가지고 있으며 각각의 주문에는 목록 상자가 있습니다. 목록 상자를 바인딩해야합니다. 다시 한 번 감사드립니다 – Nanda
@Nanda - 내 대답이 도움이 되었습니까? 나는 당신의 jsfiddle에서 무슨 일이 벌어지고 있는지 정말로 이해할 수 없다. 나는 매핑 플러그인으로 보여준 것을하기를 원할 경우 데이터를 올바르게 형성하기 위해 mappingOptions를 사용해야 할 것이라고 말하고 싶다. – madcapnmckay
정말 도움이되었습니다. 녹아웃 고급 바인딩에 대한 명확성이 더 있습니다. 내가 수동 viewmodel을 사용하고있는 경우에는 코드를 따라갈 수 있습니다. 하지만 매핑 플러그인을 사용하고 있으며 녹아웃 및 매핑을위한 초보자입니다. 따라서 고급 옵션을 사용할 수 없습니다. 하지만 나는 시도해 볼 것이다. 매핑에 대한 아이디어가 있다면 의견을 공유하십시오. madcapnmckay 정말 고마워. – Nanda