내 viewmodel에 따라 뷰를 업데이트하는 데 어려움이 있습니다. 내가하는 일을 요약하면 : 나는 아이템 (AllCredentials)의 배열을 가지고있다. 항목의 속성 중 하나는 "IsSelected"값입니다 (true 또는 false). 항목 값이 false (AllCredentials 배열을 만들 때 기본값) 일 때 항목은 "UnselectedCredentials"목록에 나타납니다. 이 목록의 항목을 두 번 클릭하면 "IsSelected"값이 토글되어 다른 "SelectedCredentials"목록에 나타납니다.넉 아웃 계산 된 배열이 올바르게 업데이트되지 않습니다.
내가 테스트 할 때 두 번 클릭했을 때 "IsSelected"값이 올바르게 토글되고 있지만 계산 된 배열 (2 개 중 2 개는 각각 2 개 목록에 해당)은 그에 따라 추가/제거되지 않습니다. "UnselectedCredentials"목록에서 항목을 두 번 클릭하면 "IsSelected"값이 false에서 true로 전환되어 목록에서 제거되고 "SelectedCredentials"목록에 추가됩니다. 여기
내 코드입니다 :뷰 모델 :
var TestNWJS = TestNWJS || {};
TestNWJS.QualificationList = (function() {
//private functions
function FindUnselectedCredentials() { //function to populate UnselectedCredentials list
var filtering = ko.utils.arrayFilter(TestNWJS.QualificationList.ViewModel.AllCredentials(), function (item) {
return item.IsSelected === false;
});
return filtering;
}
function FindSelectedCredentials() { //function to populate SelectedCredentials list
var filtering = ko.utils.arrayFilter(TestNWJS.QualificationList.ViewModel.AllCredentials(), function (item) {
return item.IsSelected === true;
});
return filtering;
}
function CreateQualificationModel(allCredentialsList) {
TestNWJS.QualificationList.ViewModel = {};
TestNWJS.QualificationList.ViewModel.AllCredentials = ko.observableArray(allCredentialsList);
TestNWJS.QualificationList.ViewModel.UnselectedCredentials = ko.computed(FindUnselectedCredentials, this);
TestNWJS.QualificationList.ViewModel.SelectedCredentials = ko.computed(FindSelectedCredentials, this);
TestNWJS.QualificationList.ViewModel.AllCredentials.extend({ notify: 'always' });
TestNWJS.QualificationList.ViewModel.UnselectedCredentials.extend({ notify: 'always' });
TestNWJS.QualificationList.ViewModel.SelectedCredentials.extend({ notify: 'always' });
}
function toggleselected(id) {
var match = ko.utils.arrayFirst(TestNWJS.QualificationList.ViewModel.AllCredentials(), function (item) {
id = parseInt(id);
return id === item.Id;
});
match.IsSelected = !match.IsSelected;
return match;
}
//public function
return {
Init: function (allCredentialsList) {
CreateQualificationModel(allCredentialsList);
//when you select something from the dropdown this will happen.
$("select[name='QualificationFilter']").change(function (e) {
var id = $(this).val();
e.preventDefault();
var form = $(e.target).parents("form");
var url = window.location.href.substr(0, window.location.href.lastIndexOf("QualificationList") + 17)
form.attr("action", url + "?Id=" + id);
form.submit();
});
$("#UnselectedCredentialsList").live('dblclick', function (e) {
toggleselected(this.value);
});
$("#SelectedCredentialsList").live('dblclick', function (e) {
toggleselected(this.value);
});
ko.applyBindings(TestNWJS.QualificationList.ViewModel);
}
}
})();
보기 :
<div>
<table>
<tr>
<td class="fieldName_td">
@Html.Label("Available Credentials")
</td>
<td class="fieldData_td">
<select data-bind="options: UnselectedCredentials,
optionsText: 'Name',
optionsValue: 'Id'"
size="10" multiple="multiple" id="UnselectedCredentialsList"></select>
</td>
</tr>
</table>
</div>
<div>
<table>
<tr>
<td class="fieldName_td">
@Html.Label("Selected Credentials")
</td>
<td class="fieldData_td">
<select data-bind="options: SelectedCredentials,
optionsText: 'Name',
optionsValue: 'Id'"
size="10" multiple="multiple" id="SelectedCredentialsList"></select>
</td>
</tr>
</table>
</div>
}
@section scripts {
@Scripts.Render("~/Scripts/knockout-2.2.1.js", "~/jscripts/Administration/Interfaces/QualificationList.js", "~/Scripts/knockout.mapping-latest.js")
<script type="text/javascript">
$(function() {
TestNWJS.QualificationList.Init(@Html.Raw(Model.JsonAllCredentials));
})
</script>
}
그냥 명확히하기 위해, 페이지의 초기로드에서 "UnselectedCredentials"목록이 나타나고있다 (즉, 처음에는 모든 것이 나타납니다) "IsSelected"값이 false 인 AllCredentials 배열의 모든 자격 증명이 나타납니다. 내가 겪고있는 문제는 뷰를 (및 잠재적으로 viewmodel) 값을 전환하려면 두 번 클릭 트리거 후 올바르게 업데이트되지 않는 관련이 있습니다.
생성자 함수를 사용하여 자격 증명 클래스를 만드는 것이 무엇을 의미하는지 명확히 할 수 있습니까? 그게 내 전망 모델에 있겠 니? – John
예. 설명 할 답변을 업데이트하고 있습니다. – Beartums
귀찮은 일은 싫지만 credentialFromJson.forEach (function (c) { var credential = new 자격 증명 (c.Name, c.Selected)) Credentials.push (자격 증명); } 제대로 작동하도록. 나는 그것을 내 Init 함수에 배치하고 자체의 개인 함수에 넣으려고했지만 거기에 구문 오류가있는 것, 그 기대 ')' – John