2011-02-24 4 views
2

Dojo 위젯 (dijit) 객체를 문자열 또는 브라우저 세션에서 지속될 수있는 표현으로 직렬화/비 직렬화 할 수 있는지 알고있는 사람이 있습니까?dojo 위젯 오브젝트를 직렬화/비 직렬화 할 수 있습니까?

내 시나리오 :모든 스냅 샷을 가져 와서 새로운 브라우저 세션에서 복원 할 수 있기를 원하는 다양한 dijits가있는 웹 페이지가 있으므로 모든 것이 정확히 같은 상태로 복원됩니다. 이 작업을 수행하기 위해서는 페이지의 DOM 트리와 dijit 개체를 직렬화/복원해야한다고 생각합니다. 나는 DOM 트리를 직렬화 할 수 있었고 현재 페이지의 HTML 노드 내용을 바꾸어서 복원하고있다. 페이지의 DOM이 복원되면 dijits가 작동하지 않습니다. 올바르게 렌더링되지만 아무 것도 클릭 할 수 없습니다. 나는 dojo 파서가 페이지를 처음로드 할 때 DOM을 통해 이미 실행했고, 전체 HTML DOM 요소를 대체하면 해당 페이지에 대한 dijit 레지스트리의 모든 dijits가 삭제되기 때문이라고 생각한다. 즉, dijit 클래스를 다시 작성해야한다는 의미이다. 인스턴스화.

이상적으로 내가 할 수 있기를 원하는 것은 "스냅 샷"을 취할 때 dijit.registry에 포함 된 모든 dijit 객체를 파일에 직렬화하고 세션이 복원 될 때, 이 dijit 오브젝트를 재구성하여 dijit 레지스트리에 다시 추가하십시오.

뭔가 같은 : dijit.registry.forEach (기능 (위젯) {? //가 새 브라우저 인스턴스를 복원 할 수 있도록 위젯 객체를 저장 });

누구나 이것을 시도했거나 사용자 지정 직렬 변환기를 작성하지 않고 가능한지 알고 있습니까?

답변

1

사용중인 기술에 동의하지 않을지 확실하지 않습니다. 보다 나은 시나리오는 단순히 각 dijit에 대한 데이터의 상태를 직렬화하는 것입니다. 나는 이것이 더 많은 일이 될 것이지만 당신은 데이터의 상태를 보존하려고 노력하고 있으며, 타고있는 UI를 가져 오는 것은 불필요한 정보를 보존하는 것처럼 보입니다.

도장 분석기는 페이지로드와 독립적으로 호출 할 수 있습니다. http://docs.dojocampus.org/dojo/parser

+0

제안 솔루션을 구현하는 과정은 다음과 같습니다. 1) 전체 dijit 객체를 직렬화하는 대신 dijit의 상태를 복원하는 데 필요한 속성 만 직렬화하십시오. (함수와 순환 참조 건너 뛰기) 2) DOM 트리가 다시 채워지면 dojo.parser.parse()를 실행하여 모든 dijits를 다시 인스턴스화하십시오.) 만 메서드 호출을 통해 인 Dijit의 상태를 수정할 수 있습니다 ( – treaint

+0

2 단계 걱정을 3)는 Dijit 정보를 직렬화하고 각는 Dijit에 대한 \t 유형에 기반 유형 \t는는 Dijit에 호출 방법은 그 상태를 복원 할 -Determine 나 : 파서가 페이지를 재 묘화하면 각 dijit이 첨부 된 DOM 요소의 속성이 수정됩니까? (dijit가 "새"상태로 다시 인스턴스화되었으므로) 3 단계는 구현하기가 어려울 수 있습니다. dijit 유형과 특정 속성 이름을 기반으로 호출해야하는 메소드를 찾아야합니다. 예를 들어, 위젯이 dijit.form.textbox이고 속성이 {value : "First Name"} 인 경우 나는이 두 가지 정보를 받아서 dijit.form.textbox.set을 호출해야합니다 'displayedValue', 'First Name') – treaint

0

모든 자바 스크립트 객체 (Dojo 위젯 포함) : 당신이 찾고있는 것은 당신이 다시 채 웁니다 후 innerHTML을 다시 분석하고 전체 참조 할 수 있도록이 페이지를 참조하십시오 dijits을 다시해야 실행

dojo.parser.parse(); 

입니다 dojo.toJson()를 사용하여 JSON으로 직렬화 할 수 있습니다 예 :

var deserialisedValue = dojo.toJson(myObject); 
+0

dijit.registry.forEach (function (w) { console.log (dojo.toJson (w)); }}); "DOM 노드를 직렬화 할 수 없습니다"예외가 발생했습니다 – treaint

+0

어떻게 작동합니까? 역 직렬화를 제안하는 방법은 무엇입니까? 참조 : http://stackoverflow.com/questions/22945894/dojo-how-to-load-an-object-containing-other-objects-from-json – sixtyfootersdude

0

내 생각 엔 우리가 직렬화 및 도장 위젯을 역 직렬화하지만, (또한 저장의 종류)에 저장되는 이러한 위젯이 있었다 수 있다는 것입니다 건축 또한 직렬화 및 직렬화가 필요합니다. 이것은 악으로 간주되는 eval 문의 사용을 포함 할 수 있습니다. 또한 이벤트 처리기, 이러한 위젯 구독 항목을 serialize 및 deserialized 수 없습니다 생각합니다. 합니다 (dijits이 직렬화됩니다)받는 페이지가 위젯의 같은 번호가있는 경우

0

, 가장 간단한 해결책은 dijit/form/Form 안에 모든 것을 마무리하고 deserialise하기에는 직렬화하는 valueJSON = form.get('value')form.set('value', valueJSON)를 호출하는 것입니다.

dgrid 및 차트와 같은 양식 내부의 위젯의 경우 더 까다로워집니다. 위젯 관련 접근 방식을 취해야합니다. 예 : grid.save()JSON.stringify (grid.get('store'))을 호출하여 값이 변경된 dgrid를 쉽게 serialize 할 수 있습니다.deserialisation 페이지 Incase의

위젯의 임의의 수를 가질 수있다, 나는 우리가 비슷한 문제가 있었다 widget.get('declaredClass') \\Returns TextBox etc.

를 통해 위젯의 유형을 얻기에 관하여 갈 수 @treaint에 동의하지만, 우리는 폼의로 아주 쉽게 해결 값을 얻거나 설정하십시오! 그것의 독창적 인, 그것은 모든 아이들을 반복하고, 그들 모두에게 child.get('value')을 호출하고 그것을 자신의 가치와 혼합합니다.

관련 문제