2017-09-12 11 views
0

레벨을 가질 수 있고 기존 속성을 가질 수있는 객체가 있습니다. 게다가, 객체 및/또는 그 속성이 관찰 가능할 수도있다. 예를 들어 :경로로 객체의 관찰 가능한 속성을 설정하십시오.

나는이 같은 방식으로 뭔가에 중첩 수준 (관찰 및 비 관찰 가능한 모두) 모든 속성을 설정하는 방법이 필요
var obj = { 
    prop: "qqq", 
    obsProp: ko.observable({ 
     nestedObsProp: ko.observable({ 
     prop: 'value' 
     }) 
    }) 
}; 

: I가 시도

set(obj, 'obsProp.nestedObsProp.prop', 'new value'); 

을 lodash 함수 _.set()을 사용합니다. 속성이 observables가 아닌 경우에만 작동하지만 obj (업데이트해야 함)의 속성은 관찰 가능 또는 불가능합니다. 감사합니다. 감사합니다.

답변

0
function set (source, key, newValue) { 
    const hierarchy = key.split('.'); 
    const property = hierarchy.pop(); 

    const retrived = hierarchy.reduce((source, key) => { 
     return source[key]; 
    }, source) || source; 

    if (ko.isObservable(retrived[property])) { 
     retrived[property](newValue); 
    } else { 
     retrived[property] = newValue; 
    } 
} 
0

yoel neuman, 답변 해 주셔서 감사합니다. 작은 수정 사항으로 기본 접근 방식으로 기능을 사용했습니다 :

function set(source, path, newValue) { 
    const hierarchy = path.split('.'); 
    const property = hierarchy.pop(); 

    var retrieved = hierarchy.reduce((source, key) => { 
     return ko.isObservable(source) ? source()[key] : source[key]; 
    }, source) || source; 

    retrieved = ko.isObservable(retrieved) ? retrieved() : retrieved; 
    if (ko.isObservable(retrieved[property])) { 
     retrieved[property](newValue); 
    } else { 
     retrieved[property] = newValue; 
    } 
} 

불행히도 귀하의 답변에 투표하기에 충분한 평판을 얻지 못했습니다. 도움을 많이 주셨습니다!