백본

2011-11-23 8 views
0
난 작은 Backbone.js 응용 프로그램을 구축하고 (이름 게터는 예를 들어 연결된 1 세대 성과 이름을 반환) 모델 중 하나에 일부 사용자 지정 게터를 추가하고

에 덮어 게터와보기를 렌더링 :백본

PersonModel = Backbone.Model.extend({ 
    get: function (attr) { 
    if (typeof this[attr] == 'function') { 
     return this[attr](); 
    } 
    return Backbone.Model.prototype.get.call(this, attr); 
    }, 

    name: function() { 
    return firstName + " " + lastName; 
    } 
}) 

이제는 person.get("name")을 사용하여 nice라는 이름을 검색 할 수 있습니다. 그러나 모델에 toJSON을 호출하면 이러한 값이 포함되지 않습니다. 문제는 내보기를 렌더링하는 데 사용하는 것입니다 :

this.template({people: this.collection.toJSON()}); 

Backbone.js에서 이것을 수행하는 가장 좋은 방법은 무엇입니까? 덮어 쓰기 된 getter로 수동으로 JSON을 생성 하시겠습니까?

감사합니다.

+0

왜 "이름"을 실제 속성으로 만드나요? –

+0

정적 속성을 원하지 않기 때문에. 이 예제에서'firstName'을 변경하면'name'은 업데이트 된 이름을 반환해야합니다. 별도로 변경하고 싶지는 않습니다. 말이 돼? – Cimm

답변

5

당신은 PersonModel에 자신의 toJSON 방법을 제공 할 수있다 :

toJSON: function() { 
    var attr = Backbone.Model.prototype.toJSON.call(this); 
    attr.name = this.name(); 
    return attr; 
} 

collection toJSON는 각 모델에 toJSON 호출

// The JSON representation of a Collection is an array of the 
// models' attributes. 
toJSON : function() { 
    return this.map(function(model){ return model.toJSON(); }); 
}, 

그래서 추가하여 모델에 toJSON 일을해야 자신의.

당신은 또한 실제 속성으로 name을 추가 한 다음 namefirstName 경우 또는 lastName 변경을 업데이트하기 위해 모델의 validate 방법을 조정하고 name을 변경하거나 읽기 전용 특성을 편집하기위한 시도 "에 대해 불평하는 직접적인 시도를 무시할 수 누군가 name 번을 set으로 변경하려고하면 validate은 주어진 속성 객체를 변경할 수 없으므로 {firstName: 'x'}을 부여하고 으로 변경하여 validate을 반환합니다. 이것은 validate의 약간의 남용이지만, validate에 대한 속성 집합을 변경하는 것에 대한 명시 적 금지는 없으며 사용자가 가지고있는 유일한 후크입니다. 모델이 자신의 firstNamelastName으로 이벤트를 변경하고 set({name: ...})을 트리거하도록 모델을 들려 줄 수는 있지만 다른 사람이 이름과 성만보고있는 경우 이벤트 주문 문제가 발생할 수 있습니다.

+0

+1 모든 옵션을 제공하지만, 난 그냥 못생긴 보이는이 솔루션을 달성하기 위해 유효하지 않습니다 : P는 내가 첫 번째 솔루션을 사랑하지만, 오늘은 약간 다른 접근 방식으로 비슷한 게시물에 응답, toJSON()되고 toFullJSON() 메서드에서 호출, 바보 같은 날, 내가 기본값을 재정의 할 수있는 방금 여분의 특성을 추가 : – Sander

+0

@Sander : 나는'validate' 부분이 좋지는 않지만 어떤 지원도 없다는 것에 동의한다. 백본의 가상 속성을 위해 그리고 그것을 스스로 설정하기위한 훅 (hook)의 방법에는별로 없습니다. 생성자/구문 분석/유효성 검사는 약간의 비표준 작업이 필요한 경우에 대한 것입니다. 나는 이것이 많은 ORM-ish 시스템이 가지고있는 일반적인 "객체가 구조체이다"접근법에 대한 문제의 예라고 말하고 싶다. –

+0

감사합니다. 이것은 설명대로 정확하게 작동합니다. – Cimm

0

백본 모델을 확장하고 모든 응용 프로그램 모델을 방법을 포함하는 기본 모델에서 확장하여 모델 toJSON 방법으로 병합 된 가상 속성을 설정하도록 선택할 수 있습니다.

toJSON: function() { 
    return _.extend(toJSON.__super__.constructor.apply(this, arguments), this.getVirtualAttributes()); 
    }, 
    getVirtualAttributes: function() { 
    var attrs, key; 
    attrs = {}; 
    for (key in this.virtualAttributes) { 
     attrs[key] = this.virtualAttributes[key].call(this); 
    } 
    return attrs; 
    } 

가상/동적 속성을 검색하는 데 사용할 수있는 모델에 virtualAttributes 객체를 정의 할 수 있습니다.

virtualAttributes: { 
    email_length: function() { 
    return this.get("email").length 
    } 
}