2017-01-31 6 views
1

: 이제을 세부적으로 조정 상쾌한는 엠버 경로에 하나 개 이상의 모델의 약속을로드 <code>Ember.RSVP.hash</code> 사용을 지원하기 위해 잘 알려진 방법있다

// app/routes/posts.js 

export default Ember.Route.extend({ 

    model(params) { 
    return Ember.RSVP.hash({ 
     posts: this.store.findAll('post', params), 
     tags: this.store.findAll('tag', params), 
    }); 
    }, 

}); 

나는 page PARAM이가 될 수 있습니다 게시물을로드하고 한 번에 모두 표시하는 대신 일괄 적으로 게시물을로드 할 수 있습니다. 하지만 페이지를 변경해도 태그는 변경되지 않습니다. 그러나 페이지 매개 변수가 변경되면 경로 전체 모델이 다시로드되어 다시로드되어 앱이 새 페이지의 게시물과 같은 태그를 다시 다시 가져옵니다.

특정 매개 변수가 변경 될 때 태그가로드되지 않도록 미세 조정할 수 있습니까?

답변

1

코드를 리팩토링하는 데는 몇 가지 방법이 있습니다. 태그를 모델 밖으로 이동하는 것과 같습니다. 또는 페이지 매김을 다르게 수행합니다 (모델 새로 고침 없음). 내가 좋아하는 것은 커스텀 getAll 유틸리티를 작성하는 것이다.

var cache = {}; // model_name => Promise<[Record]> 

function getAll(store, model) { 
    if(!store.modelFor(model).cacheable) { 
     return store.findAll(model); 
    } 

    if(!cache[model]) { 
     cache[model] = store.findAll(model); 
    } 

    return cache[model]; 
} 

그리고 모델의

지금 것은, 실제 시나리오에서 나는 (물론 게시물 및 태그 예를하지 않은)에서 가져온 하위 모델 중 하나를 마주하고있어입니다

import { getAll } from 'utils/store'; 
... 
tags: getAll('tag'), 
+0

'Ember.RSVP.hash'는 변경된 경로 매개 변수의 전부는 아니지만 일부에 의존합니다. 다른 매개 변수는 변경된 모든 매개 변수에 따라 다릅니다. 따라서 두 번째 하위 모델을 가져 오려면 모델 후크'params '가 필요합니다. 변경된 param이 결과에 영향을 미치지 않을 때 다시 가져 오기를 원하지 않습니다. – Ernesto

+1

그럼 위의 예제를 필요에 따라 수정할 수 있습니다. 캐시 속성 (params)에 추가 인수를 추가합니다. param이 같고 모델 이름이 같으면 캐시에서 가져오고 그렇지 않으면 new를로드하십시오. –

+0

@Ernesto 어떤 성공? –