2011-09-13 3 views
11

Backbone.js 사용 set 메서드를 사용하여 모델의 속성을 설정하고 attributes internal hash을 직접 수정하지 않는 것이 좋습니다.backbone.js 모델 내부 특성 해시를 직접 설정하십시오

그러나 "change"이벤트를 자동으로 실행하지 않는 것 외에 내부 해시를 직접 수정하는 데있어 다른 부작용이나 "부작용"이 있습니까?

제가 직면 한 문제는 set 메소드가 객체 리터럴을 사용하는 반면 실행시 결정된 변수를 사용하여 왼쪽에 할당해야한다는 것입니다. 감사. 당신이 annotated source code 보면

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

답변

15

글쎄, 당신은 set 많이한다는 것을 확인할 수 있습니다.

당신은 당신을 위해 그것을 수행하는 기능을 Backbone.Model를 확장하면 어떻게 :

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

느낌 : 다음

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

, 당신은 당신이 모델에 직접 원하는 것을 할 수 있습니다 나에게 더 나은 해결책을 원합니다. earl3s 지적 @으로 편집

이 더 이상 백본의 최신 버전에 필요하지 않습니다. 오늘 model.set(myProperty, "bar")으로 전화하면 원하는대로 처리됩니다.

+1

나는 귀하의 솔루션이 훌륭하다고 생각합니다. 이 기능은 최신 Backbone 릴리스로 병합되어야합니다! 주석이 달린 소스 코드를 지적 해 주셔서 감사합니다. 당신 말이 맞아요. 처음부터 보았어야했는데. – fortuneRice

+0

멋진! 나는이 코드를 12 번이나 썼다. 그리고 그것을 결코 방법으로 생각하지 않았다. :) btw : 이것을 사용하지 않아도됩니다. 'Backbone.Model.prototype.setByName = function (...) {...} '같은 기능을합니다 ... 기능적으로 동일합니다. 그것을하는 다른 방법. –

+0

@Derick Bailey : Funny ... 나는'_.extend'가 프로토 타입을 확장하기 위해 약간의 영리를 가지고 있다고 생각했습니다. 실제로 모든 변경 사항을 가진 객체를 확장하는 것입니다. 아무것도 거기에 미치지 않는다. 내 대답을 바꾸면 그것을 인정합니다. 감사. –

7

Brian Genisio가 언급 한 annotated source code에서 다음 줄을 읽을 수 있습니다. "키 값", 값 및 {키 : 값} 스타일 인수 "모두 처리". 그래서 model.set (myProperty, "bar", options) 만 사용할 수 있습니다. 아마도 그들은 Brian Genisio의 게시물 이후에이 기능을 추가했습니다. 나는 몰라요.

+0

올바른 해결책입니다. 이 기능은 이미'set' 메소드에 존재합니다. – earl3s

관련 문제