gpt4 book ai didi

javascript - Backbone.js:始终检测模型何时设置了属性,而不是/只是/已更改

转载 作者:行者123 更新时间:2023-11-30 12:58:17 25 4
gpt4 key购买 nike

在 Backbone 中,当我将模型的属性设置为与之前相同的值时,“更改”事件不会触发。

我的看法:

initialize: function() {
this.$lastRollResult = this.$el.find('#lastRollResult');
this.listenTo(this.model, 'change:lastRoll', this.render);
},

render: function() {
this.$lastRollResult
.html(this.model.get('lastRoll'))
.addClass('shaking');

var self = this;
setTimeout(function() {
self.$lastRollResult.removeClass('shaking');
}, 1000);
},

events: {
'click #button': function() {
this.model.set('lastRoll', getRandomInteger(1, 6));
}
}

有时当我调用 getRandomInteger() 时,int 将与前一个相同,导致我的 .set('lastRoll', int) 无法注册为“更改”事件。但这意味着我的“摇动”类将不会应用,这很糟糕。

如何让 Backbone 始终识别属性何时设置,即使我设置的值相同?有某种“固定”事件吗? (没有在文档中看到一个。)

编辑:我知道可能有一个 {silent: true}/.trigger() hack 来完成这个,但是是否有任何“干净”或“语义”的方式总是识别 .set() 调用?

最佳答案

我认为你的设计是错误的。 View 不应该选择一个随机数并告诉模型这是它的新值, View 应该告诉模型汇总一个新数字。然后你可以在你的模型中有这个:

roll: function() {
this.set('lastRoll', getRandomInteger(1, 6), { silent: true });
this.trigger('change:lastRoll', this, this.get('lastRoll'));
}

您的 View 将只是this.model.roll()。是的,您仍然会进行 {silent:true}trigger 黑客攻击,但至少它会在正确的位置。

当然,这可能会产生奇怪的副作用,因此您可以在模型背后悄悄取消设置值,然后再设置新值:

roll: function() {
// I suppose you could quietly unset here if you feel bad
// about fiddling with `attributes`.
this.attributes.lastRoll = null;
this.set('lastRoll', getRandomInteger(1, 6));
}

同样,在模型上使用单独的 roll 方法是一种向外界隐藏所有这些诡计的简便方法。

关于javascript - Backbone.js:始终检测模型何时设置了属性,而不是/只是/已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18295023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com