1

Я только что начал с HotTowel и очень впечатлен. Мне удается научиться использовать его с привязкой к нокауту. Вот проблема, я столкнулся:HotTowel: Viewmodel потеряет отображение при навигации между страницами

У меня есть сайт с 3 страниц: Главная, О, Jar

В 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. Однако, когда я перехожу к Home и возвращаюсь, отображение ko теряется. Я проверяю его с помощью хром-консоли и проверяю массив массивов, и все его элементы потеряли узел ko.mapping в атрибуте. Таким образом, я не могу удалить банку, но могу добавить к ней новую.

Может ли кто-нибудь помочь мне разобраться, как переназначить объект после навигации? Спасибо.

ответ

4

Ваш repo.getJars (this.jars); является асинхронной задачей, поэтому вы должны вернуть обещание в своей функции активации, чтобы все работало правильно.

Думаю, что это будет делать трюк:

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

Ваш репо также должен вернуть обещание:

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

Что бы вы сделали, если вам необходимо сделать материал в способе АКТИВИРУЙТЕ после того, были загружены данные? – SB2055

+0

Я сделаю что-то вроде: var prom = $ .Deferred(); someStuff(), а затем (функция() { \t promise.resolve();} ).. Сбой (функция() { \t promise.reject();} ); возвращение обещание; –

 Смежные вопросы

  • Нет связанных вопросов^_^