Как установить динамическое свойство в модели с помощью Backbone.js

История: У меня есть много свойств, которые необходимо установить. Поскольку у них есть сходства, я выбираю для чтения класс, который является входным полем как имя свойства.

Проблема: Динамическое свойство объекта можно задать так же, как ассоциативный массив. Поэтому я мог сделать

var customattribute = this.$el.parents('div').attr('id');
var value = $(e.currentTarget()).val();

this.model.attributes[customattribute] = value;

Но это не вызовет событие изменения модели. Я мог бы вручную инициировать событие изменения, но это не будет обновлять this.model.changedAttributes(), мне нужно установить только измененный атрибут, а не каждый атрибут.

Это, конечно, тоже не работает:

this.model.set(customattribute: value);

Итак, как бы я справился с этой проблемой?

У меня есть атрибуты ALOT (200+), которые можно установить, я бы не хотел создавать отдельные eventlisteners для каждого атрибута, если только это не единственный способ.

код:

var Display = Backbone.View.extend({
    className: 'display',
    events: {
        'slide .slider' : 'sliderHandler'
    },
    initialize: function(){
        _.bindAll(this, 'render', 'sliderHandler','update');
        this.model.on('change',this.update, this);
    },
    render: function(){
        this.$el.html(_.template(html, {}));
        this.$('.slider').slider();

        return this;
    },
    sliderHandler: function(e){
        var slider = $(e.currentTarget);
        var property = slider.parents('div').attr('id');
        var value = slider.slider('value');

        this.model.attributes[property] = value;            
    },
    update: function(){
        console.log(this.model.changedAttributes());
        //get changed attribute + value here

    },
});

Edit:

Два ответа ниже решили. Сопоставьте атрибуты с объектом и передайте его на Магистраль. Также я нашел другое решение. Вместо объекта model.set() также принимает массив.

model.set(customattribute, value, customattribute2, value2);

Ответы

Ответ 1

Я не уверен, что полностью понимаю вашу проблему, но: Если вы хотите обновить атрибут, просто:

this.model.set({
     customattribute: value
});

Если вы хотите, чтобы этот параметр не вызывал событие, вы можете передать тихий параметр, например:

this.model.set({
     customattribute: value
}, {silent:true});

Надеюсь, это поможет вам.

ОБНОВЛЕНО

Другой способ:

 var map = {};
 map[customattribute] = value;
 this.model.set(map);

Ответ 2

Вам нужно сделать это

var attributeName = this.$el.parents('div').attr('id');
var value = $(e.currentTarget()).val();
var attribute = {};
attribute[attributeName] = value;
this.model.set(attribute);

если атрибут был "test", а значение "value" было бы таким же, как

this.model.set({test: 'value'});

что является тем, что правильно устанавливает атрибут и распространяется на ваш взгляд, благодаря событию изменения модели