2013-01-04 7 views
4

Ember-Data의 Rest Adapter에 적합하지 않은 API가 있습니다. 약 3 가지 모델이 있으므로 jQuery에서 오래된 $ .ajax를 사용하기로 결정했습니다. 모델을 검색하고 올바른 방법으로 컨트롤러에 전달하는 방법을 찾는 동안 내 마음을 아프게했습니다. 그렇지 않으면이 같은 일을하는 것은 불가능하다, 내가 .findAll 방법은 E.ArrayProxy의 인스턴스를 반환해야한다는 것을 발견ember-data없이 모델을 검색하는 방법은 무엇입니까?

App.Router.map(function(match) { 
    match('/posts').to('posts'); 
}); 

App.PostsRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Post.findAll(); // Just renamed to .findAll. 
    } 
}); 

:

이 가이드에서 다음 예를 살펴

{{#if content}} 
    ... 
{{else}} 
    <strong>Nothing to display</strong> 
{{/if}} 

그리고 내 구현은 이렇게 보입니다 :

App.Post.reopenClass({ 
    findAll: function() { 
    var result = Ember.ArrayProxy.create({content: []}); 

    $.getJSON('/posts', function(data) { 
     $.each(data, function(i, row) { 
     result.pushObject(App.Post.create(row)); 
     }); 
    }); 

    return result; 
    } 
}); 

저는 이것에 상당히 만족합니다. 하지만 단일 객체로 작업하는 방법을 상상할 수는 없습니다.

App.PostsRoute = Ember.Route.extend({ 
    model: function(params) { 
    return App.Post.find(params.post_id); 
    } 
}); 

// This will not work for me. Controller's content property will alway be null. 
App.Post.reopenClass({ 
    find: function(postId) { 
    var result = null; 

    $.getJSON('/' + postId, function(data) { 
     result = App.Post.create(data); 
    }); 

    return result; 
    } 
}); 

해결책은 무엇입니까?

비어있는 내용으로 Ember.ObjectProxy 인스턴스를 반환해야하며 실제로 개체로 채워진 내용을 Ember에 알려 주어야합니까? 황금의 길은 무엇입니까?

답변

13

기본적으로 ember-data가하는 평범하고 오래된 개체를 사용할 수 있습니다.

App.Post.reopenClass({ 
    find: function(postId) { 
    // Set some default properties here. 
    var result = Ember.Object.create({ 
     isLoaded: false 
    }); 

    $.getJSON('/' + postId, function(data) { 
     result.setProperties(data); 
     result.set('isLoaded', true); 
    }); 

    return result; 
    } 
}); 

이것이 골든 경로입니까? 아마도 Ember에 더 많이 잠복할수록 ember-data가 약속 한 풍부한 기능이 더 많이 필요할 것입니다. 몇 달 전에 나는 내 자신의 프레임 워크를 썼다. ember-data와 비교하면 끔찍하지만 루트 요소, 측면로드 데이터, 강조 표시된 이름 및 지원되는 포함 관계는 필요하지 않습니다. 나는 ember-data가 성숙함에 따라이를 다루기를 희망하고 있으며, 그들이 힘들어서 어댑터와 시리얼 라이저를 쉽게 교체 할 수 있다는 것을 알고있다.

+0

왜 reopenClass를 사용합니까? App.Post = Ember.Object.extend()를 선언 할 때 find 함수를 정의 할 수없는 이유는 무엇입니까? 나는 이것을 시도하고 "find"메소드를 찾을 수 없다. "ReopenClass"가 이상하게 보입니다. – netpoetica

+0

인스턴스 메서드가 아닌 클래스 메서드입니다. –

+3

Reopen() 대신 reopenClass()를 사용하는 이유가 설명되어 있지만 여전히 App.Post를 선언 할 때 동시에 선언 할 수없는 이유를 이해하지 못합니다. – netpoetica

관련 문제