1

我正在尝试让最后一个关于敲除的教程与 Typescript 一起使用,但似乎无法填充电子邮件网格。

class WebmailViewModel {

    folders: any;
    chosenFolderId: any;
    chosenFolderData: any;
    public event_goToFolder: (folder) => void;

    constructor () {

        this.folders = ['Inbox', 'Archive', 'Sent'];

        this.chosenFolderId = ko.observable();
        this.chosenFolderData = ko.observable();

        this.event_goToFolder = ((folder) => {
            this.chosenFolderId(folder);
            $.get('/mail/' + folder + ".txt", { folder: folder }, this.chosenFolderData);
            // send JSON result to DIV
            $("div#jsond").text(JSON.stringify(this.chosenFolderData()));
        });

        // set default folder
        this.event_goToFolder("Inbox");
    }
};

ko.applyBindings(new WebmailViewModel());

我的观点:

    <ul class="folders" data-bind="foreach: folders">
        <li data-bind="text: $data, css: { selected: $data == $root.chosenFolderId() }, click: $root.event_goToFolder"></li>
    </ul>

    <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>
                <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>
    <div style="border:4px solid blue" data-bind="text: chosenFolderData"></div>
    <div id="jsond" style="border:4px solid black"></div>

当我运行该应用程序时,我可以在 DIV #jsond 中看到 JSON 数据,但电子邮件网格未按预期显示,来自演示。

值得一提的是,我使用的是本地存储的 TXT 文件,其中包含 JSON 数据——而不是使用某种实际的 Web api。但是,JSON 数据在 DIV 中显示得很好,所以我不认为这是一个问题。

这是我的 JSON 数据:

"{\"id\":\"Inbox\",\"mails\":[{\"id\":1,\"from\":\"Abbot <oliver@smoke-stage.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 25, 2011\",\"subject\":\"Booking confirmation #389629244\",\"folder\":\"Inbox\"},{\"id\":2,\"from\":\"Addison Begoat <upton.oprdrusson@pear-income.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 7, 2011\",\"subject\":\"FW: Associate advice\",\"folder\":\"Inbox\"},{\"id\":3,\"from\":\"Allistair <leroy72@plane-railway.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 19, 2011\",\"subject\":\"RE: Phone call tomorrow 5 o'clock\",\"folder\":\"Inbox\"},{\"id\":4,\"from\":\"emmanuel26@ghost.xyz\",\"to\":\"steve@example.com\",\"date\":\"May 22, 2011\",\"subject\":\"Completing basketball project\",\"folder\":\"Inbox\"},{\"id\":5,\"from\":\"jamalia.alnismith1@twigdad.xyz\",\"to\":\"steve@example.com\",\"date\":\"Apr 26, 2011\",\"subject\":\"FW: Can you get DE to resubmit accounts?\",\"folder\":\"Inbox\"},{\"id\":6,\"from\":\"lionel.qugy@cribsmoke.xyz\",\"to\":\"steve@example.com\",\"date\":\"May 22, 2011\",\"subject\":\"RE: Catch up at 9:00 to finalise rain spec\",\"folder\":\"Inbox\"},{\"id\":7,\"from\":\"Madison Lalinesson <melinda.gofagy@wing-language2.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 19, 2011\",\"subject\":\"RE: Pencil scenarios\",\"folder\":\"Inbox\"},{\"id\":8,\"from\":\"rajah.nukripyford@cast92.xyz\",\"to\":\"steve@example.com\",\"date\":\"Apr 28, 2011\",\"subject\":\"Flavor benefit gig\",\"folder\":\"Inbox\"},{\"id\":9,\"from\":\"Sandra Juanhison <yoshi.mostaline72@facefruit.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 8, 2011\",\"subject\":\"RE: Apparel5 network is back up\",\"folder\":\"Inbox\"},{\"id\":10,\"from\":\"Sylvester <rose.va@bunpig98.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 1, 2011\",\"subject\":\"Feedback requested by Ayanna Nuyo\",\"folder\":\"Inbox\"},{\"id\":11,\"from\":\"veronica@heart.xyz\",\"to\":\"steve@example.com\",\"date\":\"May 4, 2011\",\"subject\":\"Project Book starting 6pm\",\"folder\":\"Inbox\"},{\"id\":12,\"from\":\"XLN <basia@framehome.xyz>\",\"to\":\"steve@example.com\",\"date\":\"May 8, 2011\",\"subject\":\"RE: Remember Whoopi's joke\",\"folder\":\"Inbox\"}]}"

我收到的实际错误:

Uncaught Error: Unable to parse bindings.
Message: ReferenceError: mails is not defined;
Bindings value: foreach: mails 

更新:

我几乎按照淘汰赛网站上的信函中的代码进行操作。到目前为止,其他一切都运行良好......也许它会帮助我从 Typescript 转换中发布实际的 JS 代码 -

var WebmailViewModel = (function () {
    function WebmailViewModel() {
        var _this = this;
        this.folders = [
            'Inbox', 
            'Archive', 
            'Sent'
        ];
        this.chosenFolderId = ko.observable();
        this.chosenFolderData = ko.observable();
        this.event_goToFolder = (function (folder) {
            _this.chosenFolderId(folder);
            $.get('/mail/' + folder + ".txt", { folder: folder }, this.chosenFolderData);
        });
        this.event_goToFolder("Inbox");
    }
    return WebmailViewModel;
})();    
; ;
ko.applyBindings(new WebmailViewModel());
4

1 回答 1

1

您似乎没有将 this.chosenFolderData 视为可观察的,您不只是用从 get 查询返回的 JSON 覆盖它吗?如果将其更改为:

$.get('/mail/' + folder + ".txt", { folder: folder }, function(data)
{
    this.chosenFolderData = ko.mapping.fromJS(data);
});

这使用了Knockout 映射插件

于 2013-01-31T15:15:56.853 回答