데이터의 각 행에 selectall toggle 확인란과 checkbox가 있습니다.Ajax 호출 성공 후 viewmodel을 ui에 바인딩합니다. 녹아웃
이제 서버에서 반환 된 데이터에는 관찰 할 수없는 데이터가 isSelected
입니다. 각 행에 대해 'isSelected'관찰 가능을 추가했습니다. 그러나 관찰 가능하지 않은 isSelected
은 각 행의 체크 박스에 바인딩됩니다. 여기
var folderViewModel = function() {
var self = this;
self.Folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
self.SelectedFolder = ko.observable();
self.Mails = ko.observableArray([]);
self.SelectedMail = ko.observable();
self.SelectAll = ko.observable(false);
self.navigate = function (folder) {
self.SelectedFolder(folder);
//$.get('/Api/MailBox', { folder: folder }, self.Mails);
$.ajax({
url: "/Api/Mailbox",
data: { folder: folder },
success: function (data) {
ko.mapping.fromJS(data, {}, self.Mails);
ko.utils.arrayForEach(self.Mails(), function (mail) {
mail.isSelected = ko.observable(true);
mail.isSelected.subscribe(function (myvalue) {
console.log(myvalue);
});
});
console.log(ko.toJSON(self.Mails()));
},
statusCode: {
404: function() {
alert("No Mail");
}
}
});
//ko.mapping.fromJS(data, {}, self.Mails);
//console.log(ko.toJSON(self.Mails));
};
self.SelectAll.subscribe(function (newValue) {
ko.utils.arrayForEach(self.Mails(), function (mail) {
console.log(mail.isSelected());
mail.isSelected(newValue);
});
console.log(newValue);
}, self);
this.navigate("Inbox");
};
ko.applyBindings(new folderViewModel());
그리고 여기에 바인딩입니다.
<table class="table table-bordered table-striped table-condensed table-hover">
<thead>
<tr>
<th>
<input type="checkbox" data-bind="checked: SelectAll"/>
@*<input type="checkbox" />*@
</th>
<th>
From
</th>
<th>
To
</th>
<th>
Subject
</th>
<th>
Date
</th>
</tr>
</thead>
<tbody data-bind="foreach:Mails">
<tr data-bind="click:$root.navigateToMail">
<td style="width: 15px">
<input type="checkbox" data-bind="checked: $root.isSelected">
@*<input type="checkbox">*@
</td>
<td data-bind="text: From">
</td>
<td data-bind="text: To">
</td>
<td data-bind="text: Subject">
</td>
<td data-bind="text: MailDate">
</td>
</tr>
</tbody>
체크 박스 <input type="checkbox" data-bind="checked: $root.isSelected">
mails.isSelected=ko.obsevable(true)
에서 아약스 데이터 바인딩지고 있지 않습니다. 무엇이 문제일까요?
훌륭한 답변이지만 한 부분을 설명하는 데주의하십시오. 실제로 데이터에 관찰 가능한 속성을 연결 한 다음이를 녹아웃 매핑으로 매핑했음을 강조합니다. 죄송합니다 멍청한되고 있지만 둘 다 같은 arent? 처음에는 관찰 할 수있는 배열을 만들고 observable 속성을 첨부하면 (분명히 내가 한 일이지만 작동하지 않았다). 여기 내 잘못이 무엇인지 설명해 주시겠습니까? – Joy
아무런 문제가 없으며 멍청한 질문이 있습니다. 한가지는 ViewModel입니다. (전체 함수 객체를 생각해보십시오. 하나는'$ root' 태그로 액세스하고 다른 하나는 메일 모델입니다. 당신의 ViewModel은 Mail Models의 콜렉션 (ko.observableArray)을 가지고 있는데, 바인드해야 할 때 ViewModel ('$ root.isSelected' 작업)에'isSelected'를 바인딩하는 것이 문제였습니다 각 메일 모델과 적절한 범위에 대한 설명입니다. – jjperezaguinaga
이것은 유명한 Javascript의'this' 단어와 관련이 있습니다. foreach의 Mail 객체에 ko.observable을 추가했을 때 컨텍스트는 무엇입니까? ViewModel이었습니다. Btw, Model은 "클래스"를 나타내는 Backbone에서 복사 한 구문 일 뿐이며 KnockoutJS에서는 실제로 사용되지 않습니다.이 단어를 사용하면 당신의 메일은 sp 특정 클래스에서 ecific 개체와 당신을 혼란스럽게하지 마십시오 :) – jjperezaguinaga