2013-02-01 2 views
2

knockoutjs를 사용하고 observableArray에 대한 ko.mapping 및 사용자 정의 업데이트 바인딩을 포함한 프로젝트를 설정하십시오. 값을 직접 설정하면 ko.mapping.fromJS를 사용할 때 업데이트 바인딩이 한 번 실행되고 업데이트 바인딩이 두 번 실행됩니다. 당신은이 표현이 아니다로는 updateBinding 바인딩에서 구문을 호출하는 모든 기능을 사용할 필요가 없습니다observableArray와 함께 ko.mapping을 사용할 때 업데이트 바인딩이 두 번 실행되는 이유는 무엇입니까?

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript" src="knockout-2.2.1.js"> </script> 
    <script type="text/javascript" src="knockout.mapping.js"></script> 
</head> 
<body> 
    <div data-bind="foreach: ObservableArray, updateBinding: ObservableArray"> 
     <span data-bind="text: Value"></span> 
    </div> 
    <script type="text/javascript"> 
     ko.bindingHandlers['updateBinding'] = { 
      init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
       console.log("Binding Handler (Init)"); 
      }, 
      update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
       console.log("Binding Handler (Update)"); 
       var data = ko.utils.unwrapObservable(valueAccessor()); 
      } 
     }; 

     function MainViewModel() { 
      var self = this; 

      self.ObservableArray = ko.observableArray(); 
     } 

     var viewModel = new MainViewModel(); 

     // Fires Init + Update for ObservableArray 
     ko.applyBindings(viewModel); 

     // Setting directly fires Update for ObservableArray once 
     viewModel.ObservableArray([{ "Value": "Lucky Luke" }]); 

     // Setting via mapping fires Update for ObservableArray twice 
     ko.mapping.fromJS({ "ObservableArray": [{ "Value": "Ludwig van Beethoven" }] }, {}, viewModel); 
    </script> 
</body> 
</html> 
+0

다른 작업을 수행하고 있는지 잘 모르겠습니다. 그러나 이것은 나에게 발생하지 않습니다. 보고있는 문제를 재현하는 바이올린을 게시 할 수 있습니까? http://jsfiddle.net/tyrsius/Sgsh6/ – Tyrsius

+2

마크 업을 표시 할 때까지 합리적인 답변을 제공하는 것은 불가능합니다. 마크 업에는 이것이 발생할 수있는 다른 요인이있을 수 있습니다. –

+0

샘플을 수정했는데 (이전의 테스트는 틀 렸습니다) 가능한 한 간단하게 제 문제를 재현했습니다. – Dresel

답변

2

이 일반 오브젝트의 배열을 삽입하고 지금 (github 참조)에 고정 될 때 knockout.mapping하여 버그이었다.

+0

오늘도 똑같은 경험을하게됩니다. –

+0

나의 바이올린 예제 (http://jsfiddle.net/edNCJ/)가 새로운 knockout.mapping 버전으로 작업 중입니다. – Dresel

+0

나는 내 문제가 ajax.post 호출에서 어디서 JSON 데이터를 제공하지 않고 이것이 어떤 방식 으로든 다시 시도하도록 유발 한 오류를 일으킨다는 것을 알았다. –

0

아래 Fiddle 또는 코드를 참조하십시오.

updateBinding: People().Records() 

는 같아야

updateBinding: People().Records 

조금 불통 : http://jsfiddle.net/twRFf/3/

+0

이것이 불확실한 부분입니다. 대괄호를 빠져 나올 때 fromJS에서 업데이트 바인딩이 실행되지 않는 이유는 무엇입니까? 왜 대괄호로 시작합니까? 매핑 플러그인이 DOM이 바인드 된 초기 뷰 모델을 덮어 씁니까? 어떻게 그걸 막을 수 있니? – Dresel

+0

매핑 플러그인없이 사용해보십시오. 문제가 없다. – WiredPrairie

+0

업데이트 바인딩 내에서 종속성을 생성해야합니다. 그렇지 않으면 knockoutjs가 트리거하지 않습니다 (http://stackoverflow.com/a/14716216/1249506 참조). 그러나 질문은 동일하게 유지됩니다 - 매핑 플러그인을 배우고 이해하려고 노력합니다. 수동으로 매핑하는 것은 옵션이 아닙니다 :) – Dresel