2014-11-20 4 views
2

저는 Backbone 및 Firebase을 처음 사용합니다.Firebase Backfire : model.set()이 Firebase에 동기화되지 않습니다.

var UsersCollection = Backbone.Firebase.Collection.extend({ 
    model: UserModel, 
    firebase: new Firebase("https://xxxxxx.firebaseio.com/users"), 
}); 

모델 자체가 중포 기지에 연결되지 않은 ("잘못된 중포 기지 참조가 만든"지고 있다고 오류) : 내보기에

var UserModel = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      email: "[email protected]" 
     }; 
    } 
}); 

, 내가 인스턴스화 내가 가지고 컬렉션을 백 파이어를 사용하고 있습니다 컬렉션은, 나는 데이터가 괜찮 얻을, 다음과 같이 저는, 컬렉션에 새로운 모델을 추가 할 수 있습니다

this.allUsers = new UsersCollection(); 
... 
this.allUsers.add(userData); 

는 새로운 사용자 레코드가 중포 기지에 큰 표시 작동합니다. 그러나,의 내가 지금의 데이터를 특정 사용자의 모델을 잡고 업데이트 할 가정 해 봅시다 :

var userRecord = this.allUsers.findWhere({email: email}); 
userRecord.set({age: age}); 

이 로컬 모델을 업데이트하지만 변경된 모델은 중포 기지에 동기화 점점되지 않습니다. 나중에 userRecord.save(); 시도했지만 "순환 참조"오류가 트리거됩니다. 워드 프로세서 당, set() 그것이 allUsers 모음이 아직 데이터로 채워되지 않았기 때문에 userRecord 변수이 경우 다시 정의되지 않은 제공

+0

사실, set()을 호출하면 Firebase의 변경 사항이 유지되지 않으므로 .save()는 순환 참조 오류를 반환합니다. – Kato

+0

.set()을 호출하면 0.4 버전에서 Firebase에 대한 변경 사항이 유지됩니다. 나는 동일한 코드를 실행했고 Firebase를 지속 할 수있었습니다. userData 변수로 무엇을 사용하고 있습니까? –

+0

UserData를은 매우 간단 하나 개의 중첩 수준이 있습니다 '{ "ID를": "-JDFx3e를 ..", "이메일": "[email protected]" "이름": "피트", "이벤트": { "-Jxfe ..": { "수량"2 }, "-JzDa ..": { "수량"1 } } }' 추가() 컬렉션에 잘 작동합니다. 그러나 추출 된 모델에()을 설정하려고 할 때. userRecord.set ({events : events}), 해당 작업은 모델에서 로컬로 작동하지만 Firebase에서 "지속"하지 않습니다. 표준 백본 모델이 여기에 괜찮습니까? 아니면'Backbone.Firebase.Model.extend()'가 필요합니까? - 언제 사용할 지 모르겠습니다. – pete

답변

3

:(분명히 뭔가가 꺼져 가시해야한다. 데이터는 여전히 중포 기지에 다운로드되고 당신이 .findWhere()를 호출 할 때.

이러한 문제가 발생하지 않도록하려면 sync 이벤트를 수신하고 거기에서 모든 작업을 수행 할 수 있습니다.

JSBin example을.

allUsers.on('sync', function(collection) { 
    // collection is allUsers 
    var userRecord = collection.findWhere({email: '[email protected]'}); 
    userRecord.on('change', function(model) { 
    console.log('changed', model); 
    }); 
    userRecord.set({age:4}); 
}); 

컬렉션에 대한 작업을 처리하기 전에 컬렉션이 채워 졌는지 확인해야합니다. 이렇게하려면 sync 이벤트가 권장됩니다.

+0

'sync '팁을 보내 주셔서 감사합니다. 그러나'set()'을 실행할 때 유효한'userRecord' 모델을 가지고있었습니다. [JSBin] (http://jsbin.com/livuwe/2/edit)을 복제하려고 시도했습니다. 특히 모델의'events' 속성을 중첩 된 객체로 업데이트하려고합니다. 내부 키가 정의되지 않은 상태로 돌아오고 있지만 여기에서 계속 유지되는 것 같습니다. – pete

+0

이전과 같은 문제입니다. userRecord를 갱신하면 비동기 조치입니다. 데이터가 반환되었는지 확인하기 위해서는'change' 메소드를 청취해야한다. 나는 대답과 바이올린을 업데이트했다. –

+0

내 응용 프로그램에서 중첩 된 데이터 집합을 수행하는 것은 나에게 다른 문제이다. (아직이 시점에서 구조체와 관련이있을 수는 있지만)이 답변은 다른 곳에서 매우 유용하게 사용되었다. – pete

관련 문제