..

Template String As Object Property Name

문제

Odoo에서 판매 - 오더, 오더 - 구매, 오더 - 제조 연결하는 기능을 개발하기 전에 어떻게 코드를 작성할지 고민했다. 요구사항이 비슷했기 때문에 중복되는 기능을 하나의 클래스에 정의하고 각 모듈에서 상속받아 재정의하거나 확장해 사용하기로 했다.


연결 여부를 판단하는 필드는 각각 달라 상속받아 연결 여부를 판단하는 필드를 선언해주었다.

const LinkSaleModel = LinkOrderModel.extend({
    init: function (parent, params) {
        this.linkField = 'link_id';
        this._super.apply(this, arguments)
    },
});


연결 여부를 체크함 / 체크하지 않음에 따라 데이터베이스에 연결 여부를 저장해야했고, 연결 여부를 판단하는 필드를 담은 linkField 변수를 object의 key로 사용하고 싶었다.

아래와 같이 `${this.linkField}` 와 같이 쓰면 된다고 생각했지만, 아니었다.

setIsLink: function (id = 0, value = undefined) {
    if (id && value !== undefined) {
        return this._rpc({
            model: 'sale.order.line',
            method: 'write',
            args: [id, {
                `${this.linkField}`: value,
            }],
        });
    }
},

해결

object의 key 값으로 template string (``)을 사용하고 싶은 경우에는, 대괄호([])로 감싸주어야 한다.

setIsLink: function (id = 0, value = undefined) {
    if (id && value !== undefined) {
        return this._rpc({
            model: 'sale.order.line',
            method: 'write',
            args: [id, {
                [`${this.linkField}`]: value,
            }],
        });
    }
},

참고

https://stackoverflow.com/questions/33194138/template-string-as-object-property-name