2011-11-30 2 views
10

나는 다음과 같은 경로가 레일에서 정의한 :백본 및 레일 중첩 된 경로

resources :accounts do 
    resources :transactions 
end 

이 같은 URL을 결과 :

/accounts/123/transactions/1 

백본 모델 세트에이지도하는 쉬운 방법이 있나요 쪽으로?

답변

21

백본은 아주 쉽게 백을 mo에서 컬렉션을 중첩하여 지원한다. 다음과 같이 del :

var Account = Backbone.Model.extend({ 

    initialize: function() { 
    this.transactions = new TransactionsCollection; 
    this.transactions.url = '/account/' + this.id + '/transactions'; 
    this.transactions.bind("reset", this.updateCounts); 
    }, 
}); 

이것은 정확히 내가 원하는 것을 달성합니다.

당신은 여기에 대한 자세한 내용을보실 수 있습니다 : http://documentcloud.github.com/backbone/#FAQ-nested

+2

이것은 페치 콜을 통해 백엔드에서로드 된 기존 모델에 유효합니다. 그러나 방금 만든 모델은? initialize 메소드가 호출되면, 백엔드에서 레코드를 생성하는 ajax 호출은 끝나지 않고'this.id' 필드는'undefined'입니다. 이것에 대처하는 방법에 대한 아이디어? – Ernesto

+0

방금 ​​생성 된 모델의 URL 생성을 처리하는 한 가지 방법은 url을 문자열이 아닌 함수로 만드는 것입니다. 위의 줄은 다음과 같이 바뀔 수 있습니다 :'this.transactions.url = function() {return '/ account /'+ this.id + '/ transactions'};' – stereoscott

1

그냥 모델이나의 URL (사용하는 경우) 당신과 같이 수집 정의 :

var MyModel = Backbone.Model.extend({ 
    url: 'accounts/123/transactions' 
}); 

또는 동적 :

mymodel.url = 'accounts/' + accountId + '/transactions'; 

그 모델이거나 컬렉션의 모든 모델을 이렇게하면 백엔드 URL이 생성됩니다.

상세 정보 :

모델 : http://documentcloud.github.com/backbone/#Model-url

컬렉션 : http://documentcloud.github.com/backbone/#Collection-url

+0

첫 번째 뜻은 아마 모든 트랜잭션 경우가 그 하나 개의 계정에 속하는 것을 의미 할 것입니다 그것을 작동하지. 예를 들어 url을 'accounts/: account_id/transactions'로 정의 할 수 있다면 좋을 것입니다. 두 번째 옵션을 조사하겠습니다. –

+1

모델 및 컬렉션의 url() 메서드를 재정의 할 수도 있습니다.보다 복잡한 URL 구축 메커니즘을 구현할 수 있습니다. – ProTom

4

그것은 쉽게되지 않을 수도 있습니다하지만 가장 좋은 방법은 URL을 사용하고 기능을 설정하는 것입니다 생각 like :

var Transaction = Backbone.Model.extend({ 
    url: function(){ 
     var url = 'accounts/"+this.account_id+"/transactions'; 
     if (this.id !== undefined){ 
      url += "/"+this.id 
     } 
     return url; 
    } 
}); 

또는 어쩌면 coffeescript로 하나 개 + 레일) :

class Transaction extends Backbone.Model 
    url: -> 
     url = "accounts/#{@account_id}/transactions" 
     url += "/#{@id}" if @id != undefined 
     url 

아, 그리고 당신이 더 나은 반드시 깊은 중첩으로 더 많은이 (같은 그것을 할 수) :

var url = ["accounts", this.account_id, "transactions"] 
if (this.id !== undefined) url.push(this.id) 
return url.join("/") 


AFAIK 지금 백본 URL 유틸리티가 , 그리고 그것은 나를 위해 다른 많은 라이브러리에서 하나를 검색 할 정도로 많은 고통이 없다. :)

2

백본에 직접 중첩 된 URL의 작성을 지원하지 않습니다. 함수를 사용하여 중첩 된 객체의 결과 url을 동적으로 계산해야합니다. 예를 들면 :

var Account = Backbone.Model.extend({ 

    initialize: function() { 
    this.transactions = new TransactionsCollection(); 
    var self = this; 
    this.transactions.url = function() {return self.url + self.id + '/transactions';}; 
    // etc 
    }, 
}); 

더 많은 정보 : http://documentcloud.github.com/backbone/#FAQ-nested