2013-04-17 3 views
4

나는 겉보기에 단순한 엠버 질문에 당혹 스럽다. 난 active_model_serializers meta data serialization rails 컨트롤러에서 내 레일 current_user 메서드를 serialize하는 데 사용하고 this guy's temporary solution 사용하여 전역 ember 변수에 해당 current_user 메타 json을 추출하고 설정합니다.Ember.js current_user - 컨트롤러에서 전역 변수에 액세스하기

App.CustomRESTSerializer = DS.RESTSerializer.extend({ 
    extractMeta: function(loader, type, json) { 
    var meta; 
    meta = json[this.configOption(type, 'meta')]; 
    if (!meta) { return; } 
    Ember.set('App.metaData', meta); 
    this._super(loader, type, json); 
    } 
}); 

이 시점까지는 모두 좋습니다. 지금은 : 즉, 특정 속성을 호출하여 핸들에서도 App.metaData.current_user에 입력하고 의해

{{App.metaData.current_user.email}} 

을 콘솔에서 CURRENT_USER 정보에 액세스 할 수 있습니다 및 이메일 속성은 템플릿에 표시됩니다. 문제는 ember 컨트롤러에서 전역 변수에 액세스하려고 할 때 발생합니다. 그것은 너무 어리석게 쉬운 것처럼 보이지만 어떤 ember 컨트롤러 내에서 current_user에 액세스 할 수없는 것 같습니다. 나는 시도했다 :

currentUserBinding: 'App.metaData.current_user', 

currentUser: function() { 
    return App.metaData.current_user; 
}.property(), 

Ember.get('App.metaData.current_user') 

및 몇 가지 다른 방법이 있지만 액세스 할 수 없습니다. 콘솔과 핸들 바에서 직접 경로를 통해 current_user에 쉽게 액세스 할 수 있지만 엠버 컨트롤러에서는 액세스 할 수 없다는 것은 기괴합니다. 나는 명백한 것을 놓치고 있어야합니다.

도움을 주시면 감사하겠습니다.

+1

비슷한 시나리오에서'User' 모델을 만들어서'ApplicationController'의 속성으로 설정했습니다. 그래서 내 경로에서'controllerFor'를 통해 또는 컨트롤러에서'needs'를 통해 액세스 할 수 있습니다. – MilkyWayJoe

+0

그러면 서버에서 하나의 사용자 객체를 직렬화하고 currentUser와 같은 객체에 바인딩 된 ApplicationController에 currentUser 속성을 설정합니다. App.User.find (0)? –

+0

예, 아래 예를 참조하십시오. 나는 또한 조롱 된 요청으로 바이올린을 추가했습니다. – MilkyWayJoe

답변

7

우리 앱에서는 @MilkyWayJoe가 제안한 것과 동일하게 수행하지만, 귀하의 접근 방식은 정말 재미 있다고 생각합니다. JSON을 통해 current_user를 전달하는 것은 정말 우아한 접근 방식입니다.

나는 너무 많은 것을 실험하지는 않았지만 예제에서 말할 수있는 것부터 문제는 시리얼 라이저와 관련이 없다. 계산 된 속성에 문제가 있습니다. App.metaData.current_user에 따라 달라 지도록 지정해야합니다.

App.ApplicationController = Ember.Controller.extend({ 
    currentUser: function() { 
    return Ember.get('App.metaData.current_user') 
    }.property('App.metaData.current_user') 
}); 

이는 currentUser 속성마다 App.metaData.currentUser 변경을 다시 계산해야 엠버을 알려줍니다. 그렇지 않으면 fx를 한 번 (Ajax가 반환되기 전에) 실행하고 응답을 캐시합니다.

+0

굉장, 도움 주셔서 감사합니다! 이제는 두 가지 방법 모두 작동합니다. 내가 서버 쪽 템플릿에 자바 스크립트를 포함시키지 않으려 고했지만 그 방법에 어떤 이점이 있습니까? JSON 직렬화를 고수하면서 올바른 계산 속성을 사용할 수있게되었습니다. –

+0

나는 양쪽에 찬성/반대가 있다고 생각한다. ember-data가 metaData를 지원하기 전에 앱을 작성 했으므로 이러한 접근 방식을 고려하지 않았습니다. 서버 내장 소스의 한 가지 장점은 current_user뿐만 아니라 다른 모델의 데이터도 포함 할 수 있다는 것입니다. api를 통해 JSON을 가져 오는 것보다 성능이 좋을 수 있습니다. –

6

스크립트 태그에서 사용자 ID를 나타내는 변수를 정의 할 수 있습니다. 이 작업은 서버 템플릿에서 수행해야합니다

앱에서 다음
<script type="text/javascript"> 
    window.user_id = 1; 
</script> 

, 당신은 현재 사용자 모델을 저장할 ApplicationController의 속성을 정의 할 수 있습니다, 그리고 당신에게 user_id 변수 수 find :

window.App = Ember.Application.create(); 

App.store = DS.Store.create({ 
    revision: 12 
}); 

App.User = DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    fullName: function() { 
     return '%@ %@'.fmt(
      this.get('firstName'), 
      this.get('lastName') 
     ); 
    }.property('firstName', 'lastName') 
}); 

App.ApplicationController = Em.Controller.extend({ 
    userInfo: null, 
    init: function() { 
     // this will fire a GET request to users_controller 
     this.set('userInfo', App.User.find(window.user_id)); 
    } 
}); 

템플릿을 사용하면 ApplicationController#userInfo의 속성을 사용할 수 있습니다.

<script type="text/x-handlebars"> 
    <h1>App</h1> 
    {{userInfo.fullName}} 
</script> 

당신이 경로에서이 데이터를 사용해야하는 경우, 당신은 controllerFor를 사용하거나 다른 컨트롤러에서 액세스해야하는 경우, 당신은 needs를 사용할 수 있습니다.

은 그냥 앱 초기화에 하나 개 더 요청을 추가로이 모든 시나리오에 가장 적합한 솔루션이 아닐 수도 있습니다 명심 (fiddle 참조)하지만, 지금 나를 위해 트릭을 수행합니다.

+2

미래에는 json을 통해 current_user를 전달하고 서버 측 템플리트에 임베드하지 않는 방법을 알아 내고 싶습니다. 그러나 이것은 현재 작동합니다! 고마워요! –

관련 문제