2014-02-25 2 views
2

Knockout.js를 사용하여 동적 양식 디스플레이를 연결합니다. 따라서 멋진 속성 대신에 필자는 어레이에 임의의 수의 "필드"를 표시하고 표시해야합니다. 제 생각에는 제가 가깝다고 생각하지만, 제 정의 바인딩에 마무리 작업을하는 데 실패하고 있습니다.사용자 바인딩이 값을 래핑하지만 업데이트하지 못합니다.

데이터 내가 관찰 가능한의 관찰 배열이 배열을 매핑 할 ko.mapping 사용하고

myDynamicFields = [ 
     { 
     name: "email", 
     value: "[email protected]", 
     type: "text", 
     validation: {required: true}, 
     label: "Email Address", 
     }, 
     { 
     name: "username", 
     value: "bobsmith", 
     type: "text", 
     validation: {required: true}, 
     label: "Username" 
     } 
    ]; 

. 따라서 전체 배열을 관측 할 수있을뿐만 아니라 "이름"및 "값"과 같은 각 필드도 관측 가능합니다. 이 배열은 요소의 개수를 가질 수 있어야하며 "name"을 사용합니다. 뭔가 내보기에서 변경 될 때, 나는 배열의 구성원이 변경되는 묶을 수 있도록

내 사용자 정의
내가 정의 (내가 생각하는) 바인딩을 필요로하는 이유를 바인딩. 다시 말하지만, 빠른 검색을하기 위해 이름에 키가 있습니다. 그것을 확인 :

ko.bindingHandlers.specialValue = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     // This will be called when the binding is first applied to an element 
     model = _.find(viewModel, function (guy){ 
      return guy.name()==valueAccessor(); 
     }); 
     ko.bindingHandlers.value.init(element, model.value, allBindings, viewModel, bindingContext); 
    }, 
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     model = _.find(viewModel, function (guy){ 
      return guy.name()==valueAccessor(); 
     }) 
     ko.bindingHandlers.value.update(element, model.value, allBindings, viewModel, bindingContext); 
    } 
}; 

내 템플릿
(내 배열의 각 요소를 통해 간단하게 반복) 그러나

{{#.}} 
<p>{{label}}: <input data-bind='specialValue: "{{name}}", valueUpdate: "afterkeydown"'/></p> 
{{/.}} 

, 나는이 아무것도 업데이트를 수행 할 때. Knockout 코드에 깊이 들어가서 allBindingsObject_ko_property_writers이라는 속성이 없지만이 시점에서 Knockout에 대한 이해가 부족합니다.

+0

글쎄, 어떻게 값을 바인딩합니까? –

+0

@EricHerlitz 질문에 혼란스러워합니다. 나는 기존의 바인딩 (ko.bindingHandlers.value)을 감싸는 커스텀 바인딩을 만들고 있습니다. 변경시 값을 업데이트하기에 충분합니다. –

+0

업데이트하려는 내용과 혼동됩니다. 이것에서 요소에 이름을 입력 한 다음 일치하는 것을 찾은 다음 해당 요소를 모델의 value 속성으로 업데이트하려고합니다. 그건 이상하게 보입니다. 그렇다면 element.value = ko.utils.unwrapObservable (valueAccessor())와 같은 것이 필요할 것입니다. 그렇지 않으면 나는 손실에 처해있다. –

답변

0

당신이 foreach 바인딩을 사용하여 HTML이 배열을 렌더링한다는 가정하면, 당신은 실제로 ($parent으로 가장 가능성이 루트의 ViewModel) 귀하의 바인딩에 viewModel 속성으로 질문 모델에 액세스 할 수있게되었습니다. 당신은 녹아웃의 binding context here에 대한 자세한 내용을 읽을 수 있습니다.

@ robert.westerlund는 his JSFiddle에도 멋진 해결책을 제공 한 것 같습니다. 그 피들이 보여 주듯이, 녹아웃이 foreach 루프 내에서 $index 변수를 제공한다는 점을 추가하는 것이 가치가 있습니다. 이는 도움이 될 수 있습니다.