2012-11-09 2 views
1

배열이 객체 내에 중첩되어있는 경우 Knockout.js 매핑 플러그인의 'create'및 'update'콜백이 호출되지 않습니다. 사람이 기대할 때. 특히, view_model.mappedCreate({})을 호출하면 콜백이 트리거 될 것으로 예상됩니다. 여기 Knockout.js 매핑 플러그인이 객체의 배열의 '생성'또는 '업데이트'속성을 호출하지 않습니다.

이 같은 데이터 구조와 매핑 주어진 예이다 :

var data = { 
    Test: { 
     Items: [ 
      { Name: "Red", Count: 0}, 
      { Name: "Green"} 
     ] 
    }, 
    NewItem: "" 
}, 
    counter = 0; 


var vm = ko.mapping.fromJS(data, { 
    Test: { 
     Items: { 
      create: function(options) { 
       options.data.Count = ++counter; 
       console.log("Data:", options.data); 
       return ko.mapping.fromJS(options.data); 
      }, 
      update: function(options) { 
       options.data.Count = ++counter; 
       console.log("Data:", options.data); 
       return ko.mapping.fromJS(options.data); 
      } 
     } 
    } 
}); 

this jsFiddle에서 볼 수 있듯이, 상기의 출력은 : 또한

{ 
    "Test": { 
    "Items": [ 
     { 
     "Name": "Red", 
     "Count": 0 
     }, 
     { 
     "Name": "Green" 
     } 
    ] 
    }, 
    "NewItem": "" 
} 

상기 console.log 명령문이 호출되지 않습니다.

Items의 두 번째 요소는 {"Name": "Green", "Count": 1 }이고 console.log 문은 실행될 것으로 예상됩니다.

Items이 중첩되지 않으면 예상대로 작동합니다 (this jsFiddle 참조).

나는 분명히 뭔가를 간과 할 가능성이 있지만 어떤 경우 든이 문제를 해결하는 방법에 대한 통찰력과 제안에 감사 할 것입니다.

답변

1

대답은 다음과 같이 배열 이름의 매핑 최상위를 만들기 위해이었던 것으로 보인다

var vm = ko.mapping.fromJS(data, { 
     Items: { 
      create: function(options) { 
       options.data.Count = ++counter; 
       console.log("Create:", options.data); 
       return ko.mapping.fromJS(options.data); 
      }, 
      update: function(options) { 
       options.data.Count = ++counter; 
       console.log("Update:", options.data); 
       return ko.mapping.fromJS(options.data); 
      } 
     } 
}); 

this jsFiddle 당으로.

나는 다른 곳에있는 코드에서 여전히 문제가 발생하고 있지만 분명히 위에서 설명한 문제는 아닙니다.

관련 문제