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