2017-11-23 11 views
1

나는 autorunreaction의 설명을 여러 번 읽었지만 하나의 관찰 가능 항목에서 변경 사항을 감지 할 때 어떤 패턴을 사용하는지 그리고 다른 관측 항목을 업데이트하려고하는지는 여전히 내게 명확하지 않습니다.어떤 MobX 패턴을 사용하여 변경 사항을 감지하고 다른 관찰 가능 항목을 변경합니까?

예 I는 어드레스 오브젝트 아래 보여 주었다. 국가가 변경 될 때마다 다른 모든 필드를 재설정하거나 다시 초기화하려고합니다. 이를 수행하는 한 가지 방법은 다른 관찰 가능 항목을 설정하는 Address 클래스 내에 @action setCountry() {...} 클래스를 갖는 것입니다. 그러나 내 UI가 일반적인 기술을 사용하여 저장소 특성을 업데이트하기 때문에 즉, _.set(entity, attr, value)이라는 사치품이 없습니다. 그래서 autorun 같은 것을 사용하여 변경 사항을 감지하고 나머지 observables를 업데이트하고 싶습니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?

class Address { 
    @observable name; 
    @observable line1; 
    @observable line2; 
    @observable city; 
    @observable state; 
    @observable zip; 
    @observable country; 
    ... 
} 
+0

정확히 당신이 다른 관찰 가능한를 업데이 트하려는 방법? 나에게 이것은 [** 계산 **] (https://mobx.js.org/refguide/computed-decorator.html)의 훌륭한 유스 케이스처럼 들리므로 파생 값이 자동으로 업데이트됩니다. – Tholle

+1

음, 다른 값은 파생되지 않으므로이 경우 계산이 적절하지 않습니다. 한 가지 유스 케이스는 다음과 같습니다. 선택한 국가에 따라 다른 관측 대상을 해당 국가의 본사에 기본 설정하려는 경우 - 시간의 90 %가 바람직 할 수 있습니다. 그러나 사용자는 다른 주소로 주소를 자유롭게 변경할 수 있습니다. 이것은 내가 국가에 대한 변화를보고 적절하게 반응하고 싶은 곳입니다. – Naresh

답변

1

사용 사례로는 observe처럼 들릴 것입니다.

예 (JSBin)

class Address { 
    @observable name = ''; 
    @observable line1 = ''; 
    @observable line2 = ''; 
    @observable city = ''; 
    @observable state = ''; 
    @observable zip = ''; 
    @observable country = ''; 
} 

const address = new Address(); 

observe(address, change => { 
    if (change.name === 'country' && change.newValue === 'Sweden') { 
    address.city = 'Stockholm'; 
    } 
}); 

autorun(() => { 
    console.log(toJS(address)); 
}); 

setTimeout(() => { 
    address.country = 'Sweden'; 
}, 2000); 
+1

감사합니다, @ Tholle. 이것은 매우 유용합니다. 호기심에서 벗어나'observe()'를'Address' 클래스 안에 넣고 디스 포저를 캡쳐 할 수 있습니까? 이 로직을 캡슐화하기 위해'Address' 인스턴스를 정말 좋아할 것입니다. – Naresh

+1

@Naresh 문제가 없습니다! 리스너를 처분하려면 [** 이와 비슷한 **] (http://jsbin.com/podikusolu/1/edit?js,console)을 호출하고 커스텀'destroy' 메소드를 호출하십시오. – Tholle

+0

그게 완벽합니다, @ Tholle! 모든 도움을 주셔서 다시 한 번 감사드립니다. – Naresh