jquery + codeigniter + knockout + sammy,无法检索帖子数据

时间:2015-08-16 21:55:15

标签: jquery codeigniter knockout.js sammy.js

我正在使用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

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我找到了答案。我需要在'json'电话结束时加$.post,如下所示:

    $.post("<?php echo base_url().'index.php/app/getmail'; ?>", { folder : this.params.folder }, self.chosenFolderData, 'json');