2012-04-05 1 views
4

Backbone.Relational을 사용하여 내 앱에서 일부 연결을 설정하려고합니다.백본 관계 관계가 올바르게 설정되지 않았습니까?

기본적으로 백본 SearchService 모델이 있습니다. 검색에는 많은 서비스가 포함 된 ServiceList 컬렉션이 있습니다.

그러나 서비스 이니셜 라이저 내에서 상위 검색에 액세스 할 수없는 것 같습니다. 부모 검색을 로그 할 때 null이 표시됩니다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니?

은 내 검색 모델과 같이 설정 (코드 구문 오류가있을 수 있습니다, 나는 즉석에서 커피 스크립트에서 번역하고 있습니다) :

var Search = new Backbone.RelationalModel({ 
    urlRoot: '/searches', 

    relations: [{ 
    type: Backbone.HasMany, 
    key: 'services', 
    relatedModel: 'Service', 
    collectionType: 'ServiceList', 
    reverseRelation: { 
     key: 'search' 
    } 
    }], 

    initialize: function(options) { 
    // => Search "has services:", ServiceList 
    console.log this, "has services:", @get('services'); 
    } 
}); 


var Service = new Backbone.RelationalModel 
    initialize: function() { 
    // => Service "in" null 
    console.log this, "in", @get('search'); 
    } 
}); 

아니면 커피 스크립트를 선호하는 경우 :

class Search extends Backbone.RelationalModel 
    urlRoot: '/searches' 

    relations: [ 
    type: Backbone.HasMany 
    key: 'services' 
    relatedModel: 'Service' 
    collectionType: 'ServiceList' 
    reverseRelation: 
     key: 'search' 
    ] 

    initialize: (options) -> 
    // => Search "has services:", ServiceList 
    console.log this, "has services:", @get('services') 



class Service extends Backbone.RelationalModel 
    initialize: -> 
    // => Service "in" null 
    console.log this, "in", @get('search') 
+0

예, 당신이 게시 된 JS 매우-올바르지 않습니다 :

여기에 콘솔에서 작업의 순서를 표시하는 JS 바이올린입니다. 원본 coffeescript를 게시 할 수 있습니까? –

답변

10

짧은 답변

서비스의 초기화 방법에서 역 관계의 값에 액세스 할 수 없습니다.

초기화가 완료된 후 반대 관계의 값이 설정됩니다. 긴

이 자바 스크립트 가정

대답 : 당신이 관련 서비스를 제공하는 새로운 검색 모델을 만들 때

Search = Backbone.RelationalModel.extend({ 
    urlRoot: '/searches', 

    relations: [{ 
    type: Backbone.HasMany, 
    key: 'services', 
    relatedModel: 'Service', 
    reverseRelation: { 
     key: 'search' 
    } 
    }], 

    initialize: function(options) { 
    console.log(this, "has services:", this.get('services')); 
    } 
}); 


Service = Backbone.RelationalModel.extend({ 
    initialize: function() { 
    console.log(this, "in", this.get('search')); 
    } 
}); 

:

s1 = new Search({name:"Some Search",services:[{name:"service1"},{name:"service2"}]}); 

어떤 일이 일어날 것은 :

new Service model created (for service1) - name set to "service1" 
    (but, since what got passed to the model for properties is {name:"service1"} 
    you can see how this model cannot know its reverse relation yet.) 
new Service model created (for service2) - name set to "service2" 
    (same as above) 
new Search model created (for 'some search') 
    name set to 'some search' 
    service1 Service model added to Search.services 
    (triggers 'update:search' event on Service1 model) 
    service2 Service model added to Search services 
    (triggers 'update:search' event on Service2 model) 

service1.search 및 service2.search의 역방향 관계가 설정되어있는 service1 및 service2 서비스 모델이 Search.services 컬렉션에 추가 될 때까지는 아닙니다. http://jsfiddle.net/MNh7N/6/

+0

완벽한 답변. 감사. –