2012-05-22 1 views
1

null 값을 가진 객체 키를 생성 할 수있는 나머지 API가 있습니다.
이 null 값은 model.attributes에 표시되지 않습니다. 여기Model.fetch after a model.set : 예기치 않은 동작 또는 버그?

예 :

서버가 지금은 모든 것이 확인되어 다음과 같은 코드를 실행하면 {id: 1, attr: "someValue"} 또는 {id: 2, attr: null}

생성 할 수 있습니다 :

m = new MyModel({id: 1}); 
m.fetch(); 
m.get("attr"); // "bar"; 

m = new MyModel({id: 2}); 
m.fetch(); 
m.get("attr"); // undefined; 

내가 실행하면 다음과 같은 보기에서 렌더링 기능에 문제가 있습니다. 내가이 동작을 얻을 왜
1) :

m = new MyModel({id: 1}); 
m.fetch({ 
    success: function() { 
     m.get("attr"); // "bar"; 
    } 
}); 

m = new MyModel({id: 2}); 
m.fetch({ 
    success: function() { 
     m.get("attr"); // "bar"; // actually it should be undefined or null 
    } 
}); 

내 질문

은 :이 코드를 찾아보세요 왜
이해하려면?
2) 어떻게 해결할 수 있습니까?

+0

보기의 문제점은 무엇입니까? 어떤 오류가 발생 했습니까? –

+0

뷰의 문제는 attr 값이 이전 모델을 대신 비 웁니다. – antonjs

+0

'fetch'가 AJAX를 끝내고'm.get ('attr')하기 전에 어떻게 될 것이라고 생각합니까? 귀하의 의견에 대해 –

답변

1

오케이 ... 어떻게 된 일인지 ... 첫 번째 예에서는 var m을 새 모델 인스턴스로 설정합니다. 두 번째 예제에서 m을 새로운 모델로 재설정하지 않고 id 값을 설정하는 것입니다. 여전히 첫 번째 모델입니다. 그것이 당신이 "null"에 대한 변화를 보지 않는 이유입니다.

+0

@BrendanDelumpa 당신이 옳은 모든 대답 중에서. 이 문제를 해결하기 위해 당신은 무엇을 제안합니까? 모델에서 parse 함수를 사용하면 (if (! resp.attr) {resp.attr = undefined}'), 너무 어렵 기 때문에이 문제를 피하고 싶습니다. – antonjs

+0

@BrendanDelumpa 매번 새로운 모델 인스턴스를 설정해야한다고 생각합니다. 감사. – antonjs

+0

죄송합니다. 이전 버전으로 돌아 가지 않았지만, 예, 각 모델에 대해 새 모델 인스턴스를 만들어야합니다. var. –

0

m.get("attr") = "bar";을 쓸 때 m.get("attr") == "bar";을 의미합니까 (이중 등호에 유의하십시오)? 그렇지 않다면, 그 코드는 아마 당신이 생각하는 것을하지 않습니다.

어떤 경우에는 값을 검사 할 때 fetch() 호출이 아직 완료되지 않은 것이 문제 일 가능성이 큽니다. 나는 이것을 타이핑 할 때 "mu is too short"라는 주석에 언급되어있다. :)

+0

감사합니다. m.get ("attr") = "bar"; 'fetch() 호출이 아직 완료되지 않았습니다 .', m.get ("attr");을 실행하면 fetch() 호출이 완료됩니다. – antonjs

0

타이밍 문제가 있다고 생각합니다. 백본 fetch은 기본적으로 다음과 같이 진행됩니다

  1. 는 REST 경로에 대한 m.id를 사용하여 서버에 $.ajax 전화를 설정합니다.
  2. AJAX 성공 처리기는 반환 된 데이터를 parse을 통해 전달한 다음 그 결과를 set으로 넘깁니다.

은 그래서 fetch는이 null 속성 값을 무시합니다 특별한 일을하지 않는 setset 지연 꽤 많이 있습니다. 귀하의 경우 fetch은 시간 지연이있는 m.set({id: 2, attr: null})이어야합니다.

  1. 전화 m.fetch()을하고 AJAX 요청이 시작됩니다 :

    나는 당신이보고있는 것 같아요.

  2. 너는 m.get('attr')을보고 너가 예상하고있는 null을 보지 못한다.
  3. AJAX 요청이 완료되어 m.get('attr')에서 null으로 변경됩니다.

는에 success 처리기를 추가하여 가져 오기 :

m.fetch({ success: function(m) { ... }); 

m.get('attr')가 거기에 뭐가 있는지 또는 attr 변경을 기다리는 이벤트 처리기를 바인딩 :

m.on('change:attr', function(m, attr) { ... }); 
m.fetch(); 

을하고 무엇을보고 일어난다.