我在每行數據中都有一個selectall toggle複選框和複選框。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">
不獲取綁定到AJAX數據mails.isSelected=ko.obsevable(true)
。可能是什麼問題?
優秀的答案,但是要小心解釋一部分。我認爲你實際上將可觀察屬性附加到數據上,然後用敲除映射來映射它。對不起,雖然noob,但他們都不是同一件事?如果你先創建一個可觀察數組,然後附加observable屬性(這顯然是我所做的,但沒有工作)。所以請謹慎解釋我的錯在這裏? – Joy
沒問題,也沒有noob問題:)有一件事是ViewModel(想想你的整個函數對象,一個是用'$ root'標記訪問的,另一個是你的Mail Model,它只是一個表達式來描述你的ViewModel有一個郵件模型的集合(ko.observableArray);你的問題是你綁定了isSelected到你的ViewModel('$ root.isSelected'工作),而你需要綁定它給每個郵件模型和合適的範圍 – jjperezaguinaga
這與Javascript中着名的'this'這個詞有關,當你將它附加到Mail的foreach對象時,ko.observable的上下文是什麼?它是ViewModel,所以你將它綁定到你的整個ViewModel而不是你想要的Model。Btw,Model只是一個從Backbone複製而來的語法,代表一個「類」,它在KnockoutJS中並沒有真正使用;希望這個詞的使用幫助你看到你的郵件是一個sp ecific從一個特定的類對象,而不是混淆你:) – jjperezaguinaga