javascript
  • jquery
  • knockout.js
  • knockout-mapping-plugin
  • 2013-01-20 2 views 2 likes 
    2

    내 모델의 각 항목이 업데이트 된 테이블을 가져 왔으며 어레이 제거 및 추가시 두 가지 이벤트가 발생했습니다. hideElement는 jquery "fadeOut"을 호출하고 showElement는 jquery "fadeIn"함수를 호출하여 멋진 페이드 아웃/페이드 인 효과를 만듭니다.mapping.fromJS 및 템플릿이있는 knockoutjs

    <tbody data-bind='template: { foreach: entries, 
        beforeRemove: hideElement, 
        afterAdd: showElement }'> 
    

    내 모델은 다음과 같이이다 :

    var Model = function() { 
    self.entries = ko.mapping.fromJS([]); 
    this.getData = function() { 
    $.ajax({ 
        url: "/test", 
        type: "GET", 
        success: function(response) { 
         ko.mapping.fromJS(response, self.entries); 
    ... 
    
    this.showElement = function(elem) { 
        if(elem.nodeName == "TR") { 
         $(elem).fadeIn(500); 
        } 
    }; 
    
    this.hideElement = function(elem) { 
        if(elem.nodeName == "TR") { 
         $(elem).fadeOut(500); 
        }; 
    }; 
    ... 
    

    문제는 ko.mapping.fromJS(response, self.entries)이 항목을 추가/제거하는 녹아웃 것 같다 아약스 응답으로 호출 될 때마다 그들이 정확히 경우에도 것입니다 같은. 이 때문에 showElement/hideElement가 호출되고 각 테이블의 요소는 각 Ajax 호출을 제거/추가하기 때문에 "깜박임"합니다.

    내가 이렇게 잘못 사용하고 있다고 생각합니까? 아니면 잘못 사용하고 있습니까?

    +0

    어떻게'entries' 컬렉션의 항목이 같이 동일하게 표시되어있는 플러그인이 알 수 있도록 매핑 플러그인에 키 옵션을 사용할 필요가? ID와 같은 고유 한 식별자가 있습니까? – nemesv

    +0

    예, 그들은 mysql 데이터베이스의 ID를 가지고 있습니다. ID는 기본 키입니다. – nergal

    +0

    플러그인이 동일한 항목을 알고 있도록 매핑 pugin의 키 옵션을 사용해야합니다. – Anders

    답변

    2

    당신은 항목이

    http://jsfiddle.net/yWwfz/

    var mapping = { 
        items: { 
         key: function(item) { return item.id; } 
        } 
    }; 
    ko.mapping.fromJS(data, mapping, this); 
    
    +0

    네, 이렇게 해 봤는데 위의 의견에 따라 작동합니다. 감사. '\t ko.mapping.fromJS (대응 { \t \t \t 키 기능 (데이터) { \t \t \t 창 ko.utils.unwrapObservable (data.id) \t \t \t}} self.entries); ' – nergal

    +0

    서버에서 완전히 새로운 항목 목록을 가져 오려면 ... KO가 모든 항목을 완전히 제거하고 다시 추가하는 것이 더 낫지 않겠습니까? (KO에게 키가 무엇인지 알려주지 않는 것이 더 낫다.) – ClearCloud8

     관련 문제

    • 관련 문제 없음^_^