2012-06-07 5 views
5

하려면 로컬과 Backbone.js 사용에 그냥 아주 짧은 질문을 덮어 씁니다. 내 웹 사이트가 여러 브라우저 창/탭에서 열려 있고 두 창에있는 사용자가 목록에 무언가를 추가하면 한 창에서 변경 한 내용이 다른 창에서 변경 한 내용을 덮어 씁니다.backbone.js 여러 브라우저 탭/창에 로컬 스토리지는 데이터

당신은 단지 예를 Backbone.js 도도 응용 프로그램 사용, 자신을 위해 시도하려면 다음 항목 2를 첫 번째 탭에서 항목 '항목 1'을 추가하고 '두 개의 브라우저 탭

    1. 열기 http://backbonejs.org/examples/todos/index.html을 해제하는 문제가 발생하지 않도록하는 방법을 '표준 방법 만

    어떤 제안 항목 1'이 사라집니다 당신은 남아있을 것이다 '항목 2를'두 번째 탭에

  • 는 두 탭을 새로 고침 ' 이걸로?

    Thxx

  • 답변

    4

    문제는 잘 알려진 동시성 손실 업데이트 문제입니다 (Lost update in Concurrency control? 참조). 은 그냥 이해 나는, backbone-localstorage.js 파일, Store.prototype.save을 다음 신속하고 더러운 수정을 제안 할 수 있습니다

    save: function() { 
        // reread data right before writing 
        var store = localStorage.getItem(this.name); 
        var data = (store && JSON.parse(store)) || {}; 
        // we may choose what is overwritten with what here 
        _.extend(this.data, data); 
    
        localStorage.setItem(this.name, JSON.stringify(this.data)); 
    } 
    

    latest Github version of Backbone localStorage를 들어, 나는이 다음과 같이해야한다고 생각 : 확인에 대한

    save: function() { 
        var store = this.localStorage().getItem(this.name); 
        var records = (store && store.split(",")) || []; 
        var all = _.union(records, this.records); 
        this.localStorage().setItem(this.name, all.join(",")); 
    } 
    
    +0

    감사합니다. 내가 필요한 힌트. 나는 그것이 일종의 해킹 인 것을 알고있다. 그러나 그것은 트릭을한다. – user1151506

    +2

    Backbon localStorage의 최신 Github 버전에서 작동하는 코드를 포함하도록 응답을 편집했습니다. – user1151506

    +0

    안녕하세요. 어떻게 정리 하시겠습니까? – Lion789

    2

    대신 sessionStorage를 사용할 수 있습니다. http://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage을 참조하십시오.

    +0

    정답입니다. backbone.js를위한 로컬 스토리지 어댑터 만 있습니다. http://backbonejs.org/docs/backbone-localstorage.html 세션 저장소를 사용하기 위해 직접 구현해야합니다. –

    +0

    미안하지만 분명히해야합니다. 내가 원하는 것은 ** localStorage **입니다. 왜냐하면 세션간에 데이터를 유지해야하기 때문입니다. 위의 Todo 목록을 예로 들어 보겠습니다. 탭 또는 브라우저 창을 닫을 때 수행 목록을 삭제하지 않으려는 경우 다음에 앱을 다시 방문하면 그 앱을 원합니다. – user1151506

    +0

    두 개의 창을 열고 서로 다른 데이터를 채우고 둘 다 닫은 후 새 창을 열었다 고 상상해보십시오. 최근에 폐쇄 된 데이터를 가져온 데이터는 어느 것입니까? 그런 다음 본격적인 인증 및 인증이 필요합니다. – Yaroslav

    2

    야로 슬라브의 의견을 새로운 것들을 지속하기 전에 변화가 하나의 해결책이지만 내 제안은 다를 것입니다. localStorage는 보유하고있는 데이터를 변경하는 작업을 수행 할 때 이벤트를 실행할 수 있습니다. 해당 이벤트에 바인딩하고 각 탭에서 해당 변경 사항을 수신하고 발생 후 다시 렌더링 할 수 있도록하십시오.

    그런 다음 한 탭에서 삭제 또는 추가를하고 다음 탭으로 이동하면 이벤트가 발생하고 다른 탭에서 발생한 상황을 반영하여 변경됩니다. 탭으로 탭을 보는 데는 이상한 불일치가 없습니다.

    내가 추가하는 중에 뭔가를 잃어 버리지 않도록 할 생각을하고 싶습니다 (할 일 목록에 새 항목을 입력하기 시작합니다). 다른 탭으로 전환하고 삭제하십시오 뭔가, 그리고 돌아와 항목이 사라질 것을보고 싶지만 부분적으로 입력 된 새 항목은 계속 사용할 수 있어야합니다.

    +0

    이 솔루션은 사용자 환경이 개선되었습니다. – Yaroslav

    +0

    이 솔루션은 공식적으로 정확하고 해킹이 적을 것입니다. 하지만 IE, Safari 및 Chrome에는 많은 단점이나 지원 부족이 있습니다. 그냥 시도해 보니 FF에서는 잘 작동하지만 Chrome에서는 실제로 작동하지 않습니다. 그래서 위에서 언급 한 해킹과 함께했습니다. – user1151506

    관련 문제