-1

새로운 observableArray 속성을 MyViewModel의 일부에 추가하는 사용자 지정 처리기를 작성하여 처리기에서 바인딩 된 요소 내의 중첩 된 템플릿에 항상 올바른 배열 (see jsfiddle for full example)이 있는지 확인했습니다. 현재 오브젝트 bindingContext.$data가 ('아이들'내 예제에서) 차례로 그 관찰 개체의 관찰 배열이 있다면 그건이 valueAccessor()[0] 같은 이름의 속성으로 관찰 가능한 객체를 가지고 있다면 체크 핸들러 내에서 knockout.js에서 관찰 가능 객체에 속성을 추가 한 후 왜 TypeError가 발생합니까?

<div data-bind="contentAvailable: ['children','pos1']"> 
    <div data-bind="template: { name: 'default', foreach: children().pos1 }"> 
</div> 

이름이 valueAccessor()[1] ('pos1') 인 소유 - 부재시에 그들을 괴롭히는 것입니다.

은 처음에는

//within the handler 
bindingContext.$data[valueAccessor()[0]]()[valueAccessor()[1]]=ko.observableArray([]); 
//and after ko.applyBindings(MyViewModel) 
child1.children().pos1().push(new ViewChild(2)); 
child1.children().pos1.valueHasMutated(); 

valueHasMutated() and reseting the observable as shown here 노력이 거의-일 -를 추가 한 후 - 나는 돌연변이에 대해 내가 값을 밀어 때마다 통지하지 않았기 때문에 나는 핸들러 내에서 valueHasMutated()를 배치하려고 observableArray()하지만 그 결과는 Uncaught TypeError: object is not a function이됩니다 (위의 1 행에는 typeof이 표시되고 그렇지 않으면 XD가 표시됨).

근본적으로 잘못된 방법으로 이러한 오브젝트를 사용하거나 녹아웃이 어떻게 마법에 영향을 미치는지에 대한 이해가 부족합니까? : D

답변

0

여전히 종류의 당신은 당신이 당신의 바인딩 처리기에서 typeof 검사에서 i(1) 대신 i[1]이 오타가 어떻게 그렇게하려고 노력하지만, 눈치 무엇 소화 :

if(!bC.$data[i[0]]().hasOwnProperty(i[1]) || typeof bC.$data[i[0]]()[i(1)] !== 'function'){   
     var existing = bC.$data[i[0]](); 
+0

잘 그래 그건를 당황 스럽네요. 오타를 제거하면 내가 원하는 것에 더 가까워지지 않았습니다. 초기 문제는 템플릿의 일부를 묶을 속성이없는 개체에서 템플릿을 사용하려고 할 때 오류가 발생한다는 것입니다. 처음에 avioid 오류에 대한 간단한 'if'바인딩을 사용하고 나중에 속성을 추가하려고 시도했지만 DOM도 업데이트하지 못했습니다. –

+0

나는 당신의 observables/observableArrays를 당신과 같이 즉석에서 만들 수 있다고 생각합니다. 하고있다. 또 다른 접근법은 observable을 사용하여 나중에 채워지는 전체 객체를 유지하는 것입니다. 그런 다음, 'if'바인딩은 관찰 가능 객체가 객체로 채워질 때마다 실행됩니다. –