我正在使用CodeIgniter 3.0rc2,使用jQuery 1.11.3,Knockout.js 3.3.0和Sammy.js。 我正在尝试进行一次调用并检索一些JSON数据以放入我的viewModel。
我的观点是:
<!-- Mails grid -->
<table class="mails" data-bind="with: chosenFolderData">
<thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
<tbody data-bind="foreach: mails">
<tr data-bind="click: $root.goToMail">
<td data-bind="text: from"></td>
<td data-bind="text: to"></td>
<td data-bind="text: subject"></td>
<td data-bind="text: date"></td>
</tr>
</tbody>
</table>
我的ViewModel是:
function WebmailViewModel() {
// Data
var self = this;
self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
self.chosenFolderId = ko.observable();
self.chosenFolderData = ko.observable();
self.chosenMailData = ko.observable();
// Behaviours
self.goToFolder = function (folder) {
location.hash = folder
};
self.goToMail = function (mail) {
location.hash = mail.folder + '/' + mail.id
};
// Client-side routes
Sammy(function () {
this.get('#:folder', function () {
self.chosenFolderId(this.params.folder);
self.chosenMailData(null);
$.post("<?php echo base_url().'index.php/app/getmail'; ?>", {
folder: this.params.folder
}, self.chosenFolderData)
});
this.get('#:folder/:mailId', function () {
self.chosenFolderId(this.params.folder);
self.chosenFolderData(null);
$.post("<?php echo base_url().'index.php/app/getmail'; ?>", {
mailId: this.params.mailId
}, self.chosenMailData);
});
this.get('', function () {
this.app.runRoute('get', '#Inbox')
});
}).run();
};
在这一行viewModel:
$.post("<?php echo base_url().'index.php/app/getmail'; ?>", { folder : this.params.folder }, self.chosenFolderData)
我知道app / getmail会向我发送正确的数据。我测试了:
$.post("<?php echo base_url().'index.php/app/getmail'; ?>", { folder : this.params.folder }, function(data) { console.log(data) } )
我可以在控制台看到检索到的数据。 如果我将带有数据的$ .post直接替换为self.chosenFolderData,就像那样:
self.chosenFolderData( { "id" : "Inbox", "mails" : [{"id" : 1, "folder" : "Inbox" ... }] );
效果很好。 但是,正如代码所示,我得到了这个回报:
Uncaught ReferenceError: Unable to process binding "foreach: function (){return mails }"
Message: mails is not defined
我意识到数据未分配给self.chosenFolderData。 我甚至尝试过类似的东西:
$.post("<?php echo base_url().'index.php/app/getmail'; ?>", { folder : this.params.folder }, function(data) { console.log(data); self.chosenFolderData(data); } )
但它不起作用。我可以在控制台看到数据,但有相同的错误。
顺便说一句,这是基于Knockoutjs.com教程:Webmail
有人能帮助我吗?
答案 0 :(得分:0)
我找到了答案。我需要在'json'
电话结束时加$.post
,如下所示:
$.post("<?php echo base_url().'index.php/app/getmail'; ?>", { folder : this.params.folder }, self.chosenFolderData, 'json');