1

HotTowel を使い始めたばかりで、非常に感銘を受けました。ノックアウトバインディングでそれを使用する方法をなんとか学びました。私が直面している問題は次のとおりです。

私は3つのページを持つウェブサイトを持っています:ホーム、アバウト、ジャー

Jarには次のものがあります:

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ページにいる場合は正常に機能します。しかし、ホームに移動して戻ってくると、ko マッピングが失われます。chrome コンソールを使用して確認し、jars 配列を確認し、そのすべての要素ko.mappingで属性のノードが失われています。したがって、jar を削除することはできませんが、新しいものを追加することはできます。

ナビゲーション後にオブジェクトを再マップする方法を理解するのを手伝ってくれる人はいますか? ありがとう。

4

1 に答える 1

4

あなたの repo.getJars(this.jars); は非同期タスクであるため、正常に動作するように activate 関数で promise を返す必要があります。

これでうまくいくと思います:

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

レポも promise を返す必要があります。

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