code

컬렉션에 속성 설정-백본 JS

codestyles 2020. 12. 31. 08:18
반응형

컬렉션에 속성 설정-백본 JS


백본 js의 컬렉션은 set속성을 허용하지 않지만 컬렉션에 대한 일부 메타 정보를 저장해야하는 경우가 종종 있습니다. 해당 정보를 설정하는 가장 좋은 장소는 어디입니까?


Collection을 의도 한대로 모델 번들로 사용하는 것이 가장 좋습니다. (Julien은 이미 OP에 이것을 언급했습니다. 왜 그가 옳다고 생각하는지 설명하고 싶습니다)

Backbone의 문서 예제 에서처럼 Book (모델)의 Library (컬렉션)를 생각하고 있다고 가정 해 보겠습니다. 이 책 라이브러리가있는 주소와 같이 저장하려는 라이브러리에 대한 메타 정보가 있다는 것은 의미가 있습니다.

비결은 그것을 메타 정보로 생각하지 않는 것입니다. 많은 속성이있는 도서관이 있는데, 그 속성 중 하나가 책 모음입니다.

var Book = Backbone.Model.extend({ 
    title: "Moby Dick"
});

var Collection = Backbone.Collection.extend({
    model: Book
});

var Library = {
    address: '45th Street',
    collection: Collection
};

이 예제에서는 Library를 일반 JavaScript 객체로 정의했습니다. 물론 라이브러리를 모델로 만들어 모든 백본 벨과 휘파람을 가질 수 있습니다. 여기서 내 요점은 한 걸음 뒤로 물러나서 컬렉션에 할당하려는 추가 속성이 실제로 한 수준 위로 개체의 형제 속성이라는 것을 확인하여보다 현실적인 방식으로 현실을 표현해야한다는 것입니다.이 경우 라이브러리 .



그냥 .extend메타 데이터 저장 기능을 컬렉션.

var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        ...

        this._meta = {};
    },
    model: ...
    meta: function(prop, value) {
        if (value === undefined) {
            return this._meta[prop]
        } else {
            this._meta[prop] = value;
        }
    },
});

var collection = new MyCollection();
collection.add(someModels);
collection.meta("someProperty", value);

...

var value = collection.meta("someProperty");

특정 메타 데이터 를 저장하는 데 더 좋은 위치가있을 수 있지만 이는 메타 데이터가 무엇인지에 따라 완전히 다릅니다.

일반 메타 데이터를 저장하려면 컬렉션 생성자를 처리하는 방법으로 확장하십시오.

이 메타 데이터를 저장하고 서버에서로드해야하는 경우 더 큰 작업을 처리해야합니다.


이벤트 트리거링으로 Raynos의 접근 방식을 업그레이드 했으므로 컬렉션의 속성 업데이트에 바인딩 할 수 있습니다.

cls.groups = Backbone.Collection.extend({

    // ...

    // Reference to this collection's model.
    model: cls.group,

    initialize: function() {
        this._attributes = {}
    },

    // Extend collection with ability to store attributes and trigger events on attributes changing
    attr: function(prop, value) {
        if (value === undefined) {
            return this._attributes[prop]
        } else {
            this._attributes[prop] = value;
            this.trigger('change:' + prop, value);
        }
    },

    // ...

});


cls.group = Backbone.View.extend({

    // ...

    initialize: function() {

        // Catching attribute update
        app.groups.on('change:selected', function(value) {
            // ...
        }, this);
    },

    // ...

    events: {
        'click' : function(e) {
            // Set collection meta attribute on model's view click event
            app.groups.attr('selected', this.model.cid);
        }
    }

    // ...

});

meta매개 변수가 하나 뿐인 @Raynos 솔루션 의 기능 사용하면 효과가 없습니다. 그래서 다음 코드를 사용했습니다.

var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        this._meta = {};
    },
    put: function(prop, value) {
        this._meta[prop] = value;
    },
    get: function(prop) {
        return this._meta[prop];
    }
});

var collection = new MyCollection();
collection.put("someProperty", 12);
alert(collection.get("someProperty"));

도움이 되길 바랍니다.

참조 URL : https://stackoverflow.com/questions/5930656/setting-attributes-on-a-collection-backbone-js

반응형