이전 포스팅의 ORM의 레퍼런스와 관련한 버그가 있다.
find()의 결과를 리턴할때나 저장할때 인스턴스를 복제하지 않았다. 따라서 프로퍼티를 고치면 원래 asset을 바꾸게 된다. 그러나 update() 함수를 호출했을 때만 변경 사항을 asset에 갱신해야 하므로 이 문제를 해결해야 한다.
var asset = new Asset({name: 'foo'});
asset.save();
// 프로퍼티를 변경했지만 update()는 호출하지 않았다.
asset.name = 'wem';
find()에서 새 오브젝트를 만들도록 수정해서 이 문제를 교쳐보자. 레코드를 만들거나 갱신할 때에도 오브젝트를 복제해야 한다.
Asset.extend({
find: function(id) {
var record = this.records[id];
if(!record) throw('Unknown record');
return record.dup();
}
});
Asset.include({
create: function() {
this.newRecord = false;
this.parent.records[this.id] = this.dup();
},
update: function() {
this.parent.records[this.id] = this.dup();
},
dup: function() {
return jQuery.extend(true, {}, this);
}
});
Model.records는 모든 모델에서 공유하는 오브젝트이므로 또 다른 문제가 발생한다.
불행히도 아래코드는 모든 레코드를 섞어놓는 부작용을 포함한다.
var asset = Asset.init();
asset.save();
assert( asset in Person.records );
이 문제는 새 모델을 만들 때마다 새로운 레코드 오브젝트를 설정하는 방법으로 해결할 수 있다.
모델에 필요한 오브젝트는 Model.created() 함수에서 처리할 수 있도록 새 오브젝트 생성의 콜백을 Model.created()로 설정한다.
Model.extend({
created: function() {
this.records = {};
}
});
'자바스크립트' 카테고리의 다른 글
ORM 활용 (0) | 2022.04.10 |
---|---|
데이터 인라인 포함하기 (0) | 2022.04.10 |
ID 지원 기능 추가 (0) | 2022.04.10 |
ORM 만들기 (0) | 2022.04.09 |
MVC와 명칭공간 (0) | 2022.04.09 |