자바스크립트

레퍼런스 문제 해결

devjones 2022. 4. 10. 12:50

이전 포스팅의 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 = {};
    }
});