Javascript 如何检查数据属性是否更改?

Javascript 如何检查数据属性是否更改?,javascript,jquery,custom-data-attribute,Javascript,Jquery,Custom Data Attribute,我花了几个小时玩backbone.js,试图找出如何检查我的max模型是否改变,这几乎是不可能的,因此我决定将models cid设置为数据属性,现在似乎不可能检查数据属性是否改变了 我这样设置属性 var max = this.collection.max(function(player) { return player.get('points'); }); 当我的应用程序重新呈现数据属性时,可能会也可能不会获得新值。我真的不知道如何检查它是否发生了变化,我看到了很多肮脏的黑客和se

我花了几个小时玩backbone.js,试图找出如何检查我的max模型是否改变,这几乎是不可能的,因此我决定将models cid设置为数据属性,现在似乎不可能检查数据属性是否改变了

我这样设置属性

var max = this.collection.max(function(player) {
    return player.get('points');
});
当我的应用程序重新呈现数据属性时,可能会也可能不会获得新值。我真的不知道如何检查它是否发生了变化,我看到了很多肮脏的黑客和
setInterval
功能,但没有什么看起来很干净的,所以我希望有人知道一个干净的方法来做这件事


基本上我只想控制元素,如果它渲染来自另一个模型的新数据(意味着如果另一个模型采用最大值),我需要检查id以确认该模型是新版本,并运行动画或渲染它,显示它是新模型

首先是数据-属性-虽然您可以使用.attr或.prop访问数据属性,但数据存储在页面加载时的对象
$.cache
中,然后进行操作。属性数据-*永远不会更新

设置数据

$(this.$el).attr('data-id', max.cid)
获取数据

$el.data('id', max.cid);
不幸的是,如果不使用前面在中探讨的setInterval,就无法侦听数据中的更改

也就是说,如果只有您的代码在更新数据,那么逻辑解决方案是:

举办活动

var something = $el.data('id');
然后在更新数据时触发它

$el.on('datachange', function(){
    // procedure here
});
或者编写自己的数据函数,使用.data()并触发事件

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

例如:


您是否尝试过
console.log(此处为数据属性)I
console.log($(this.$el.data('id'))
并获得了正确的数据id,我不确定我是否理解这有什么帮助?@MichaelJosephAubry我将存储数据属性,并在执行渲染时检查它是否已更改。这很简单,对吧?听起来很简单,但假设我存储了原始数据属性,然后它会更改为新属性,然后它会更改第三次?这就是为什么我需要一种不用存储就能检测的东西?我是否感觉到属性数据-*永不更改,数据存储在对象$.cache中,该对象在页面加载时填充,然后进行操作。以前有人问过这个问题,但这不是问题,您甚至可以使用.attr访问数据属性。使用.attr访问数据属性会给您带来问题,该属性永远不会更新。因此,问题是关于侦听器的…”“不幸的是,如果不使用setInterval,就无法侦听数据的更改”怎么办?在更新数据(并触发事件)之前,请检查发送的内容是否与设置的内容不同。我不需要为你写代码,反正我写了
$.fn.mydata=function(key, variable){
    $(this).data(key, variable).trigger('datachange');
}

$el.mydata('id', max.cid);
$("#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's 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);