2017-10-18 2 views
1

아이가 제거 관찰 가능한 부모 :개편, 아래 그림과 같이 내 녹아웃 응용 프로그램에서 <code>observableArray</code>이

self.Parents = ko.observableArray([ 
    { 
     Father: 'Father-A', 
     Mother: 'Mother-A', 
     Children: ko.observableArray([ 
     {Name: 'Child-A1'}, 
     {Name: 'Child-A2'}, 
     {Name: 'Child-A3'}]) 
    }, 
    { 
     Father: 'Father-B', 
     Mother: 'Mother-B', 
     Children: ko.observableArray([ 
     {Name: 'Child-B1'}, 
     {Name: 'Child-B2'}, 
     {Name: 'Child-B3'}]) 
    }]); 

그리고 아래 그림과 같이 내가 Parents 변수에 computed observable 있습니다

ko.computed(function(){ 
    alert('Record Updated'); 
    console.log(self.Parents()); 
}); 

을 지금 때 부모를 추가/제거 할 때 부모 변수가 자식을 추가/제거 할 때 간접적으로 업데이트되므로 위에 계산 된 함수가 호출되어야한다고 생각합니다. 하지만 작동하지 않습니다. 아래 바이올린의 해결책으로, Record Updated 경고가 표시되어야합니다.

Fiddle - Code Snippet

그래서 내가 어떻게 이것을 달성 할 수 있습니까?

참고 :이 내가 만든 단지 샘플입니다 여기에이 메모를 확인하시기 바랍니다. 실제 시나리오에서 부모 개체는 타사 그리드 라이브러리로 전달됩니다. 부모/자식에서 변경이 발생하면 그리드가 업데이트되어야합니다. 그건 내가 computed functionself.Parents()을 쓴하지 Children

+0

안녕, 당신은 당신의 문제를 해결 했습니까? – adiga

+0

@adiga : 예. 내 대답은 게시 된 솔루션. – user2988458

답변

0

나는 해결책을 내 스스로 고쳤다.

자식 데이터가 변경되었음을 부모에게 통보하는 코드의 라인 아래에 자식 행을 제거한 후 :

self.Parents.valueHasMutated() 
1

당신은 객체의 모든 관측에 대한 종속성을 만들 ko.toJs를 사용할 수있는 이유입니다.

ko.computed(function() { 
    alert("Children Array changed"); 
    return ko.toJS(self.Parents()); 
}); 

computed 속성에서 작업 할 수 있습니다. 그러나 computed 건물 내부의 논리는 잘못된 것 같다, 그래서 당신은 그 computedToJS 속성에 가입 만들 :이이 모든 observables에 대한 트리거됩니다

self.isDirty = ko.observable(false); 

    self.computedToJS = ko.computed(function() { 
    return ko.toJS(self.Parents()); 
    }); 

    self.computedToJS.subscribe(function(value){ 
    self.isDirty(true); 
    // Do all your stuff here. 
    }); 

마음을. Father 속성을 observable으로 변경하고 속성을 업데이트하면 계산 된 항목이 다시 트리거됩니다.

Here's an updated fiddle

당신은 당신이 ParentViewModel을 만들 수 ko.toJS


또는 사용하여 녹아웃 더러운 플래그를 만드는 방법에 this blog post 통해 갈 수 있으며, ChildrenobservableArraywhich is available from Knockout 3.0+subscribe를 추가합니다. 예를 들어 this question을 사용할 수 있습니다.