2013-10-21 7 views
1

저장 작업이 잘못되면 Breeze 엔터티의 이전 상태를 복구해야합니다.순환 참조가있는 Breeze 엔터티를 복사하는 방법

나는 angular.copy을 사용하면 내가 순환 참조 예외를 얻을? 브리즈 엔티티를 복사 할 수있는 방법을 발견하지 않았습니다 "형식 오류 : JSON에 원형 구조를 변환"나는 더글라스 크록 포드의 그것을 시도

구현 사이클 .js,하지만 같은 개체를 다시 얻을 수 없습니다

+0

를 VAR thisEntity = thatEntity이 충분하지 왜 내가 꽤하지 않습니다 –

+0

thisEntity = thatEntity는 객체 복사가 아닌 참조 사본입니다.이 방법으로 thisEntity가 변경되면 thatEntity에 영향을 미칩니다. – yeraycaballero

답변

2

저장 작업이 실패하면 클라이언트 측 상태는 여전히 "추가", "수정"또는 "삭제"됩니다. 변경 사항은 저장에 성공한 경우에만 허용됩니다. 이렇게하면 변경 사항을 재구성하지 않고도 문제를 "수정"한 후에 동일한 엔티티를 "다시 저장"할 수 있습니다.

Breeze EntityAspect.rejectChanges을 사용하여 엔티티를 마지막으로 쿼리 한 시점의 상태로 되돌릴 수도 있습니다.

엔터티를 복사하는 가장 간단한 방법은 Breeze EntityManager.createEntity 메서드를 사용하고 원본 엔터티의 데이터 속성 만 포함 된 개체를 전달하는 것입니다. 이 기능이 작동하는 이유는 내부 엔터티에 createEntity 호출의 마지막 단계로 발생하는 새 엔터티가 첨부되면 Breeze가 외래 키 데이터 속성을 기반으로 모든 탐색 속성을 자동으로 연결하기 때문입니다.

그래서 당신은 실제로이 코드 조각을 테스트하지 않았다 (이 같은 것을 시도 할 수 있지만,이 방법은 확실히 작업을 수행합니다.

function cloneEntity(sourceEntity, keyName, newKeyValue) { 
    var sourceEntityType = sourceEntity.entityType; 

    var sourceDataProperties = sourceEntityType.dataProperties; 
    var configEntity = {}; 
    sourceDataProperties.forEach(function(dp) { 
     configEntity[dp.name] = sourceEntity.getProperty(dp.name); 
    }); 
    // you will need to give the entity a unique key before calling createEntity 
    // you could also get the keyName from metadata but I was too lazy to do that here. 
    configEntity[keyName] = newKeyValue; 

    var cloneEntity = myEntityManager.createEntity(fooEntityType, configEntity, breeze.EntityState.Added); 
    return cloneEntity; 
} 
+0

감사합니다. Jay. – yeraycaballero

0

EntityAspect.rejectChanges()을 사용해 보셨습니까?

Returns the entity to an EntityState of 'Unchanged' by rejecting all changes made to it since the entity was last queried had 'rejectChanges' called on it.

+0

방금 ​​manager.rejectChanges()를 호출하면 원하는 결과가 나타납니다. 귀하의 답을 고맙게 생각하지만 순환 참조가있는 breeze 엔티티를 복사하는 방법을 정말 알고 싶습니다. 환호 – yeraycaballero

관련 문제