2012-05-02 5 views
1

매우 기괴한 문제가 있습니다. Backbone 컬렉션이 있고 컬렉션에서 특정 특성과 일치하는 모델을 찾기 위해 where 메서드를 사용하고 있습니다. 내 문제는 결과의 모순이다.어레이의 길이가 때때로 0으로 표시됩니다.

사용자가 가입 한 목표를 추적하는 joinedGoalList가 있습니다. 이 컬렉션에 ID가 1과 3 인 두 가지 목표가 포함되어 있다고 가정 해 보겠습니다. 사용자가/goals/3에 액세스하면 사용자가 목표에 들어 갔음을 나타내는 메시지가 표시됩니다.

내가 액세스/목표/3, 메시지가 표시되는 시간의 절반, 나머지 시간이 메시지에 표시되지 않습니다.

이상한 점은이 문제는 로컬 서버가 아닌 내 원격 서버에서만 발생한다는 것입니다.

내 코드에서 joinedGoalList에 ID 3을 쿼리하고 일치하는 경우 matches 배열이 0보다 커야한다는 것을 알고 사용자가 목표에 합류했다는 메시지를 표시합니다. 여기

코드입니다 (joinedGoalList는 백본 모음입니다 :

child 
_byCid: Object 
_byId: Object 
_callbacks: Object 
length: 2 
models: Array[2] 
__proto__: ctor 

당신이 볼 수 있듯이 : 여기

console.log(joinedGoalList); 
    var matches = joinedGoalList.where({id: this.model.get("id")}); 
    console.log(matches); 
    console.log(matches.length); 
    if (matches.length > 0) { 
    console.log("the matches length is > 0"); 
    this.renderLeaveGoal(); 
    } else { 
    console.log("the matches length is 0"); 
    this.renderJoinGoal(); 
    } 

console.log(joinedGoalList)의 결과이며, 여기 결과는 (그들은 일치)입니다 길이가 2입니다. 개체 중 하나의 ID가 1이고 다른 개체의 ID가 3입니다. 이것은 페이지로드 전체에서 일관됩니다.

불일치 occu rs는 ID가 3 인 객체에 대해 배열에서 일치 작업을 수행 할 때 발생합니다. 일부 페이지가로드되면 다른 페이지를로드해도 일치하는 항목을 찾지 못합니다. console.log(matches.length)

결과는 아직 내 로컬 호스트에, 결과는 1

+0

"단지 내 원격 서버에서 발생"나에게 경쟁 조건 –

+4

당신은이 서버에서 데이터로 채워지기 전에 당신이 컬렉션을 확인하지 않을 확실 냄새? 근본적인'fetch'는 결국 비동기 적입니다. –

+1

컬렉션에있는 모델의 ID를 콘솔에 로깅하여 사용자가 가지고있는 것을 확인할 수 있도록하는 것이 좋습니다. 그 시점에서 당신이 저장하고있는 모델이 정확하게 저장되어 있는가, 그렇지 않으면'id'가 설정되어 있습니까? 사이드 노트, 여기서'where()'를 사용하는 이유 - 왜'joinedGoalList.get (this.model.get ('id'))'가 아닌가? – JMM

답변

1

내가 이벤트의 순서는 다음과 같이가는 것을 확신 항상 내 원격 서버에 0 또는 1입니다

  1. 컬렉션에서 fetch을 호출하여 서버에서 데이터를로드합니다.
  2. console.log(joinedGoalList)이라고 부르는 경우가 있는데, 일부 브라우저에서는 비동기입니다.
  3. joinedGoalList.where으로 전화를 걸어 빈 콜렉션을 찾습니다.
  4. fetch 전화는 은 콜렉션을 반환하고 채 웁니다.
  5. 에서 호출하면 채워진 컬렉션이 실행되고 인쇄됩니다.이 호출은 joinedGoalList에 대한 참조를 가지며 해당 참조는 채워진 컬렉션을 가리 킵니다.

로컬 이렇게, 4 반환에 AJAX fetch은 매우 빠르게 그래서 3 및 모든 you'e이가 기대하는 방식으로 동작하기 전에 4이 발생 단계.

당신은 여기에 몇 가지 옵션이 다음 옵션 해시 인수로 (collection, response) 전달됩니다 successerror 콜백 소요

:

  1. fetchsuccess 콜백을 가지고있다.

그래서 당신은 서버가 응답하고 컬렉션이 채워집니다 때까지 where를 호출 어떤 지연하는 success 콜백을 사용할 수 있습니다.

서버에서 모델 데이터 반환, 컬렉션이 초기화됩니다

  • fetch 컬렉션을 다시 설정합니다.

  • reset

    는 말 단일 "reset" 트리거링 이벤트 모델의 새로운리스트를 수집 교체 (또는 해시 속성)한다.

    따라서 "reset" 이벤트를 수신하고 그 이벤트를 사용하여 where을 호출 할 수 있습니다.

    관련 문제