Подтвердить что ты не робот

Как проверить, изменяется ли атрибут данных?

var max = this.collection.max(function(player) {
    return player.get('points');
});

Я провел несколько часов, играя с backbone.js, пытаясь выяснить, как проверить, изменилась ли моя максимальная модель, это было почти невозможно, поэтому я решил установить модели cid как атрибут данных, теперь кажется невозможным проверить если атрибут данных изменяется?

Я устанавливаю атрибут так:

$(this.$el).attr('data-id', max.cid)

Когда мое приложение повторно отображает атрибут data, может или не может получить новое значение. Я действительно не уверен, как проверить, изменилось ли это, я видел много различных грязных хаков и функциональность setInterval, но ничего, что казалось очень чистым, поэтому я надеюсь, что кто-то знает хороший чистый способ сделать это?

В принципе, я просто хочу контролировать элемент, если он отображает новые данные из другой модели (что означает, что если другая модель принимает максимальное значение), мне нужно проверить идентификатор, чтобы подтвердить, что модель является новой версией, и запустить анимацию или показать, что это новая модель.

4b9b3361

Ответ 1

Прежде всего атрибут data - пока вы можете получить доступ к атрибуту data с помощью .attr или .prop, данные сохраняются в объекте $.cache при загрузке страницы и затем обрабатываются. Данные атрибутов- * НИКОГДА не обновляются.

Чтобы установить данные

$el.data('id', max.cid);

Получить данные

var something = $el.data('id');

К сожалению, нет способа прослушать изменение данных без использования setInterval, как ранее изучалось в этом аналогичном вопросе.

Тем не менее, если это только ВАШ код, который обновляет данные, это логическое решение:

Настроить событие

$el.on('datachange', function(){
    // procedure here
});

Затем либо запускайте его, когда вы обновляете данные

$el.data('id', max.cid).trigger('datachange');

или напишите свою собственную функцию данных, которая использует .data() и запускает событие

$.fn.mydata=function(key, variable){
    $(this).data(key, variable).trigger('datachange');
}

$el.mydata('id', max.cid);

Пример: http://jsfiddle.net/Qn9H6/

$("#test").on('datachange', function(e, key){
    $('#feedback').hide().text('data "' + key + '" was changed to ' + $(this).data(key)).fadeIn(1000);
});

$.fn.mydata=function(key, variable){
    if ($(this).data(key)!=variable){ // check if it changed
        $(this).data(key, variable).trigger('datachange', key);
    }else{
        console.log('data wasn\'t changed');
    }
}

$('button').click(function() {
    $("#test").mydata('id', $(this).text());
})

$("#test").mydata('id', 456);