2014-08-28 7 views
0

m은 Backbone.Model의 하위 클래스입니다. 나는 m.url이()/API/미디어/소스/1 '복귀 기대 대신 내가 얻을 :단일 모델을 백본으로 가져 오는 이유는 무엇입니까?

> m.id 
1 
> m.collection.url 
"/api/media/sources" 
> m.urlRoot 
undefined 
> m.url() 
"/api/media/sources" 

을 무슨 일이야?

+0

모델의'idAttribute'와'isNew()'를 호출 한 결과를 보여줄 수 있습니까? –

답변

1

id을 URL에 추가하려면 url이 아니라 urlRoot으로 설정해야합니다.

default implementation for Backbone.Model.prototype.url를 살펴보고 그것이 이해가됩니다 밝혀

url: function() { 
    var base = 
    _.result(this, 'urlRoot') || 
    _.result(this.collection, 'url') || 
    urlError(); 
    if (this.isNew()) return base; 
    return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id); 
}, 

나중에 주석을 문제가 속성이 설정되는 얼마나 함께 할 수 있다고 (이 답변이 게시 된 후).

일반적으로 모든 특성 변경에 항상 model.set("id", idValue)을 사용해야하며, 특히 ID 특성을 사용해야합니다. (당신이 모델 프로토 타입에 뭔가 다른 idAttribute를 설정 한 경우, 대신 "id"의 첫 번째 인수로 그 이름을 사용합니다.)

을 더 일반적으로 여전히, 그것은 model.set()model.get() 대신 model.attributes directly- 사용에 액세스하는 나쁜 생각입니다. model.id 속성은 기본적으로 읽기 전용으로 취급해야하는 편의입니다. 백본은 id 속성과 관련된 모든 set() 호출에서 적절하게 수정합니다. - Platinum Azure 18 시간 전

+0

아, collection.url은 urlRoot와 마찬가지로 작동해야하지만이 코드는 실제 문제를 보여줍니다. isNew()가 true를 반환하면 id가 추가되지 않습니다. m.id가 설정되었지만 m.attributes.id가 아니기 때문에 둘 다 설정해야합니다. – elplatt

+0

아, 네. 일반적으로 모든 속성 변경에 항상'model.set ("id", idValue)'를 사용해야하며, 특히 ID 속성을 사용해야합니다. ('idAttribute'를 모델 프로토 타입의 다른 것으로 설정했다면, 그 이름을''id "'대신에 첫 번째 인자로 사용하십시오.) –

+0

일반적으로'model.attributes'에 직접 접근하는 것은 좋지 않습니다. 'model.set()'과'model.get()'을 대신 사용하십시오. 'model.id' 속성은 기본적으로 읽기 전용으로 취급해야하는 편의입니다. 백본은 id 속성을 포함하는 모든'set()'호출에서 적절하게 수정합니다. –