나는 다음과 같은 경로가 레일에서 정의한 :백본 및 레일 중첩 된 경로
resources :accounts do
resources :transactions
end
이 같은 URL을 결과 :
/accounts/123/transactions/1
백본 모델 세트에이지도하는 쉬운 방법이 있나요 쪽으로?
나는 다음과 같은 경로가 레일에서 정의한 :백본 및 레일 중첩 된 경로
resources :accounts do
resources :transactions
end
이 같은 URL을 결과 :
/accounts/123/transactions/1
백본 모델 세트에이지도하는 쉬운 방법이 있나요 쪽으로?
백본은 아주 쉽게 백을 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
그냥 모델이나의 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
첫 번째 뜻은 아마 모든 트랜잭션 경우가 그 하나 개의 계정에 속하는 것을 의미 할 것입니다 그것을 작동하지. 예를 들어 url을 'accounts/: account_id/transactions'로 정의 할 수 있다면 좋을 것입니다. 두 번째 옵션을 조사하겠습니다. –
모델 및 컬렉션의 url() 메서드를 재정의 할 수도 있습니다.보다 복잡한 URL 구축 메커니즘을 구현할 수 있습니다. – ProTom
그것은 쉽게되지 않을 수도 있습니다하지만 가장 좋은 방법은 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 유틸리티가 , 그리고 그것은 나를 위해 다른 많은 라이브러리에서 하나를 검색 할 정도로 많은 고통이 없다. :)
백본에 직접 중첩 된 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
이것은 페치 콜을 통해 백엔드에서로드 된 기존 모델에 유효합니다. 그러나 방금 만든 모델은? initialize 메소드가 호출되면, 백엔드에서 레코드를 생성하는 ajax 호출은 끝나지 않고'this.id' 필드는'undefined'입니다. 이것에 대처하는 방법에 대한 아이디어? – Ernesto
방금 생성 된 모델의 URL 생성을 처리하는 한 가지 방법은 url을 문자열이 아닌 함수로 만드는 것입니다. 위의 줄은 다음과 같이 바뀔 수 있습니다 :'this.transactions.url = function() {return '/ account /'+ this.id + '/ transactions'};' – stereoscott