1

我剛開始使用HotTowel,並且印象非常深刻。我設法學習如何使用它與敲除綁定。 這裏是我面臨的問題:HotTowel:Viewmodel在頁面之間導航時丟失映射

我有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控制檯檢查它,並檢查JAR陣列,並且它的所有元素都已經丟失屬性中的ko.mapping節點。因此我不能刪除jar,但仍然可以添加新的jar。

任何人都可以幫助我弄清楚如何在導航後重新映射對象? 謝謝。

回答

4

您的repo.getJars(this.jars);是一個異步的任務,所以你必須在你的激活函數中返回一個承諾,以正常工作。

我認爲這將這樣的伎倆:

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

你的回購也應該回報承諾:

function getJars(jars){ 
    return $.getJson(...); 
} 
+0

你會怎麼做,如果你需要做的東西,在以後的激活方法數據被加載? – SB2055 2013-07-08 00:52:43

+0

我會做這樣的事情:var promise = $ .Deferred(); someStuff(),然後(函數(){ \t promise.resolve(); })。。失敗(函數(){ \t promise.reject(); }); 退貨承諾; – 2013-07-08 05:31:55