1

我刚开始使用 HotTowel,印象非常深刻。我设法学习如何将它与淘汰赛绑定一起使用。这是我面临的问题:

我有一个有 3 页的网站:首页、关于、罐子

在罐子里我有:

define(['services/logger', 'repo/jarrepo'], function (logger, repo) {
    var Jar = function () {
        this.Id = ko.observable(0);
        this.Name = ko.observable('');        
    }

    this.jars = ko.mapping.fromJS([]);

    var vm = {
        title: ko.observable('JARS'),
        jars: jars,
        AddJar: function () {
            this.jars.push(new Jar);
        },
        DeleteJar: function (jar) {
            jars.destroy(jar);
        },
        activate: function () {
            repo.getJars(this.jars);
            return true;
        }
    };

    return vm;
});

在我看来,我有:

<div data-bind="foreach: jars">
    <label data-bind="text: name" />
    <a href="#" data-bind="click $root.DeleteJar">Delete</a>
</div>

我的回购代码:

$.getJSON("/api/jar/getjars", function (data) {
            ko.mapping.fromJS(data, jars);
        });

如果我在 Jar 页面上,它工作正常。但是,当我导航到 Home 并返回时,ko 映射丢失了。我使用 chrome 控制台检查它并检查 jars 数组,它的所有元素都丢失了ko.mapping属性中的节点。因此,我无法删除 jar,但仍然可以向其中添加新的。

谁能帮我弄清楚导航后如何重新映射对象?谢谢。

4

1 回答 1

4

你的 repo.getJars(this.jars); 是一个异步任务,所以你必须在你的激活函数中返回一个承诺,让事情正常工作。

我认为这可以解决问题:

activate: function () {
        return repo.getJars(this.jars);
    }

你的回购也应该返回承诺:

function getJars(jars){
    return $.getJson(...);
}
于 2013-03-14T12:53:08.663 回答