1

방금 ​​HotTowel을 시작했고 매우 인상적이었습니다. 나는 녹아웃 바인딩과 함께 사용하는 법을 배운다. 내가 3 페이지와 웹 사이트가HotTowel : 페이지를 탐색 할 때 Viewmodel이 매핑을 잃습니다.

: 홈, 약을, 항아리

항아리에 내가 가진 : 는 여기에 내가 직면하고있어 문제의

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> 

내 REPO 코드 :

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

Jar 페이지에 있으면 제대로 작동합니다. 그러나 홈으로 이동하여 돌아 오면 코 매핑이 손실됩니다. 크롬 콘솔을 사용하여 확인하고 jar 배열을 확인하면 모든 요소가 속성에서 ko.mapping 노드를 잃어 버렸습니다. 따라서 항아리를 삭제할 수는 없지만 새로운 항아리를 추가 할 수는 있습니다.

누구든지 내비게이션 후 개체를 다시 매핑하는 방법을 알아낼 수 있습니까? 감사합니다. .

답변

4

귀하의 repo.getJars (this.jars); 비동기적인 작업이므로 제대로 작동하려면 activate 함수에서 약속을 반환해야합니다.

나는이 트릭을 할 것이라고 생각 :

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

또한 약속을 반환해야합니다 귀하의 repo : 당신이 후 활성화 방법에 물건을 할 필요가있는 경우 어떻게 할 것인지

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

을 데이터가로드 되었습니까? – SB2055

+0

다음과 같이하면됩니다 : var promise = $ .Deferred(); someStuff()을 (함수() { \t promise.resolve(); }).. 실패 (함수() { \t promise.reject(); }); return promise; –