2011-10-20 4 views
14

내가 항상 모델 저장소를 상관없이 입력 소문자의 이름을 제공 할 수있는 방법을 찾기 위해 노력하고있어Backbone.js - 사용자 정의 세터

window.model= Backbone.Model.extend({ 
    defaults:{ 
     name: "", 
     date: new Date().valueOf() 
    } 
}) 

같은 간단한 백본 모델을 상상해보십시오. 즉,

model.set({name: "AbCd"}) 
model.get("name") // prints "AbCd" = current behavior 
model.get("name") // print "abcd" = required behavior 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

  1. 재정이 기본 모델에 변화를 수신하고 소독 입력을 저장하는 "설정"방법
  2. 사용에 "SantizedModel"여기에 내가 생각할 수있는 전부입니다. 모든 뷰 코드는 대신이 새 니타 이징 된 모델을 전달합니다.

내가 언급 한 특정 "소문자로의"예는 기술적으로보기를 검색하는 동안 기술적으로 더 효율적일 수 있지만, 예를 들어 사용자가 파운드로 값을 입력하는 경우와 다른 경우를 상상해보십시오. 내 데이터베이스의 $ s. 동일한 모델에 대해 다른 견해가있을 수 있으며 "toLowerCase"를 사용하고 싶지는 않습니다.

생각하십니까? 이 그것을 위해 만들어진되지 무엇 때문에

답변

5

그것은 해킹이 될 것입니다,하지만 당신은 항상 이것에 대한 검증 사용할 수 있습니다 다음 silent만큼 (유효성 검증 기능이 불려가는

window.model= Backbone.Model.extend({ 
    validate: function(attrs) { 
     if(attrs.name) { 
     attrs.name = attrs.name.toLowerCase() 
     } 

     return true; 
    } 
}) 

을 옵션이 설정되지 않은 경우) 모델에 값이 설정되기 전에 데이터가 실제로 설정되기 전에 데이터를 변경할 기회가 제공됩니다.

+0

감사합니다. 나는 이것 역시 고려했다.하지만 이것은 set 함수를 재정의하거나 소문자로 설정하고 백본 집합으로 전달하는 새로운 "setProperty"함수를 추가하는 것이 더 읽기 쉬울만큼 뒤떨어져있는 것처럼 보인다. 내가 놓친 게 아니라면? – Naren

+0

'set' 메소드를 오버라이드 (override) 해, 설정을 끝내기 위해서 (때문에) 얻을 수있는 것은 없습니다. 세트 전의 몇개의 전처리는? 'Backbone.Model.prototype.set'을 확장하여 일부 전 처리기를 호출 할 수도 있습니다. 일치하는 경우 ... https://gist.github.com/1310972 –

+0

유효성 검사는 save 메소드에서만 호출됩니다 또는 options.validate = true가 설정된 경우 (침묵 여기에 사용되지 않지만 대답은 꽤 오래된) 루프 대신 – webstrap

10

UPDATE : https://github.com/berzniz/backbone.getters.setters


당신이 (당신의 모델에 추가)과 같은 set 메소드를 오버라이드 (override) 할 수 있습니다 : 당신이 플러그인을 사용할 수 있습니다

set: function(key, value, options) { 
    // Normalize the key-value into an object 
    if (_.isObject(key) || key == null) { 
     attrs = key; 
     options = value; 
    } else { 
     attrs = {}; 
     attrs[key] = value; 
    } 

    // Go over all the set attributes and make your changes 
    for (attr in attrs) { 
     if (attr == 'name') { 
      attrs['name'] = attrs['name'].toLowerCase(); 
     } 
    } 

    return Backbone.Model.prototype.set.call(this, attrs, options); 
} 
+3

나는 (attrs.name) attrs.name = attrs.name 좋습니다 것이 좋습니다.toLowerCase(); – webstrap

+0

첫 번째 매개 변수가 객체 인 경우 속성의 설정은 첫 번째 매개 변수로 문자열을 사용하여'set'으로 위임됩니다. 따라서 정규화는 첫 번째 매개 변수가 문자열 일 경우에만 필요합니다. – Webthusiast

3

불다하지 않기 내 자신의 경적,하지만 이것을 해결하기 위해 "계산"속성을 가진 I created a Backbone model. 즉

var bm = Backbone.Model.extend({ 
    defaults: { 
    fullName: function(){return this.firstName + " " + this.lastName}, 
    lowerCaseName: function(){ 
     //Should probably belong in the view 
     return this.firstName.toLowerCase(); 

    } 
    } 
}) 

계산 된 속성에 대한 변경 내용을 수신하고이를 일반 내용으로 처리하는 것뿐입니다.

The plugin Bereznitskey mentioned도 유효한 접근 방식입니다.

+0

지금이 작업을 시도하고 있는데 반환 값보다 실제 함수가 표시됩니다. 'defaults : {거리 : function() {return 10; } },'console.log (this.model.get ('distance'));'?? – trapper

+0

@trapper - 링크 된 github에서 "BasecomputedModel"을 확장하고 있습니까? – Naren