2013-11-24 5 views
0

제 애플리케이션에서는 경로 맵에 공통된 부모/자식 관계가 있습니다.find() 및 find (id)를 사용하여 서버에 Ajax 호출을 호출하십시오.

App.Router.map(function() { 
    this.resource('strats', {path: "/"}, function() { 
     this.route('strat', {path: "/strat/:strat_id"}); 
    }); 
}); 

나의 이해는 엠버 먼저 부모 경로를 입력하면, 그것은() 일반적으로 서버에 Ajax 호출을 트리거 모든 모델을 얻을 찾을 호출하는 것입니다. Ember가 나중에 하위 경로로 전환하면 find(), find (id)가 먼저 호출됩니다. 아이덴티티 맵 구현 (예 : Ember-Data 또는 Ember-Model)과 함께 데이터 레이어를 사용하는 경우 find() 및 find (id)를 호출하면 데이터가 로컬 메모리에서 페치되고 Ember 응용 프로그램이 실행되는 동안이 함수를 호출 한 결과로 서버에 대한 또 다른 Ajax 호출을 시작할 필요가 없습니다. 이 이해가 정확하다면 서버 측에서 find (id)를 구현하지 않아도됩니다.

내 응용 프로그램에 Ember-Model을 사용하고 있습니다. 경로 사이를 탐색하면서 서버 측에서는 잠시 한 번씩 들어오는 개별 모델에 대한 요청을 확인합니다. find (id)를 호출하면 Ajax 호출이 서버로 트리거되는 경우가 있습니다. 이는 예기치 않게 발생했습니다. 위에서 설명한 내 논리의 결함은 어디에 있습니까?

답변

0

첫 번째로, Ember 자체는 모델에서 말하는대로 수행합니다.

그리고이 후크는 새 경로를 다시 방문하는 경우에만 호출됩니다. 위의 라우터를 사용하여 몇 가지 예를 들어 보겠습니다.

App.Router.map(function() { 
    this.resource('cow'); 
    this.resource('strats', {path: "/"}, function() { 
     this.route('strat', {path: "/strat/:strat_id"}); 
    }); 
}); 
  1. 은 내가 스트랫 경로를 확인할 수있다. 해당 경로의 모델 훅 (StratsRoute)이 히트됩니다 (귀하의 경우 찾기, 여러 개의 strats 반환).

  2. strat/1 경로를 방문하십시오. 경로 (StratsStratRoute)에 대한 모델 후크가 충돌합니다 (찾기 (1))

  3. strat/2 경로를 방문하십시오. 경로 (StratsStratRoute)에 대한 모델 후크가 치게 될 것입니다. (find (2))

  4. 나는 암소 경로 (지층 밖에 있음)를 방문합니다.

  5. strat/1 경로를 방문하면 각 경로의 모델 훅이 호출되며 한 번에 하나씩 strat 경로가 호출됩니다. StratsRoute 호출 할 것이며, 그 모델이 반환 될 때까지 그것을 반환 된 후에는 그 다음 StratsStratRoute 경로로 이동하고 그 해결 될 때까지, 한 번 등 페이지

렌더링 계속 해결 대기, 대기

흥미롭게도 Ember Model에는 흥미로운 기능이 있습니다. find 또는 fetch을 사용할 수 있습니다. find은 더미 레코드를 만들어 즉시 반환하고, 일단 ajax가 반환되면 모델을 업데이트합니다. fetch은 약속을 반환하고, 아약스가 반환되고 레코드가 완전히 빌드되면 약속을 해결합니다.

찾기 방식에는 약간의 경쟁 조건이 있습니다. 당신이 strats 경로에서 find()를하고 strat route에서 (1)을 찾으면 상상해보십시오. 이들은 즉시 (더미 레코드로) 모두 해결할 것이고 둘 다 서버를 호출 할 것입니다. 첫 번째 호출은 모든 레코드 (두 번째 호출은 레코드 # 1)에 대한 것입니다 (1 포함). 그래서 우리는 레코드 1에 2 통화를했다. 그것은 낭비였다. 이 인스턴스에서는 가져 오기가 더 좋았을 것입니다. 가져 오기로 생각해 봅시다. strats 길을 가져 와서, 이제 우리는 해결 될 때까지 기다린다.우리가 strat 경로를 쳤을 때 (서버가 모든 모델을 반환 했음) 일단 fetch (1)을 수행하고 서버를 치는 대신 모델 1이 이미 있다는 것을 알고 strats 라우트에서 내려왔다. 아약스 요청을하지 않으며 즉시 해결됩니다.

이렇게하면 먼지가 약간 지워지기를 바랍니다.

+0

그래서 Ember는 마지막 단락에서 언급 한 타이밍 문제로 인해 find()와 find (n)에 대해 서버로 이동합니다. 그러나 그 이후 Ember는 이미 모든 모델이 로컬에 저장되어 있기 때문에 응용 프로그램이 실행되는 동안에는 서버에 다시 가지 않아도됩니다. 나는 이것을 정확하게 해석하고 있는가? – ptmoy2

+0

맞습니다. – Kingpin2k