Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在“同时”属性更改时渲染一次_Javascript_Backbone.js_Backbone Views_Backbone Events - Fatal编程技术网

Javascript 在“同时”属性更改时渲染一次

Javascript 在“同时”属性更改时渲染一次,javascript,backbone.js,backbone-views,backbone-events,Javascript,Backbone.js,Backbone Views,Backbone Events,在我的Backbone.js应用程序中,我有以下模型和视图: var Operation = Backbone.Model.extend({ defaults: function() { return { sign: '-', value: '0000', index: 0 } } }); var operation = new Operation(); var Opera

在我的Backbone.js应用程序中,我有以下模型和视图:

var Operation = Backbone.Model.extend({

    defaults: function() {
        return {
            sign: '-',
            value: '0000',
            index: 0
        }
    }
});
var operation = new Operation();

var OperationView = Backbone.View.extend({

    el: '#operation',

    initialize: function() {
        this.listenTo(this.model, 'change:sign change:value', this.renderOperation);
        this.renderOperation();
    },

    renderOperation: function() {
        console.log('rendered once');
        this.$el.html(this.model.get('sign') + this.model.get('value'));
    }
});
var operationView = new OperationView({ model: operation });
观景台监视的地方

'change:sign change:value'
…在符号或值更改时更新视图

当我使用

// Test
setInterval(function() {
    var newValue = parseInt(operation.get('value'), 10);
    newValue += 500;
    newValue += '';
    operation.set({ 'sign': '+', 'value': newValue });
}, 1000);
…第一次执行setInterval时,视图将更新两次,渲染一次为console.logged 2次

然而,由于我同时设置了符号和值,我宁愿我的视图只更新一次


问题:在Backbone.js中,是否有任何方法可以在模型的多个特定属性中侦听更改,并且如果同时设置了所述多个属性,则仅渲染视图一次?

您的视图正在侦听两个“更改:符号更改:值”

因此,当该属性发生更改时,每个属性更改都会触发一次事件

您始终可以侦听模型上的更改事件。如果在同一个散列集中更改了模型属性,则只会触发单个更改

this.listenTo(this.model, 'change', this.renderOperation);
但是如果您仍然希望侦听属性上的多个更改事件,并且这些更改事件只触发一次。在设置值并触发属性更改事件时,您可能会使用hack来传递{silent:true}。有点黑

var Operation = Backbone.Model.extend({

    defaults: function () {
        return {
            sign: '-',
            value: '0000',
            index: 0
        }
    }
});
var operation = new Operation();

var OperationView = Backbone.View.extend({

    el: '#operation',

    initialize: function () {
        this.listenTo(this.model, 'change:sign change:value', this.renderOperation);
        this.renderOperation();
    },

    renderOperation: function () {
        console.log('rendered once');
        this.$el.html(this.model.get('sign') + this.model.get('value'));
    }
});
var operationView = new OperationView({
    model: operation
});

setInterval(function() {
    var newValue = parseInt(operation.get('value'), 10);
    newValue += 500;
    newValue += '';
    operation.set({ 'sign': '+', 'value': newValue }, {silent: true});
    operation.trigger('change:sign')
}, 1000);

您的视图正在侦听两个“更改:符号更改:值”

因此,当该属性发生更改时,每个属性更改都会触发一次事件

您始终可以侦听模型上的更改事件。如果在同一个散列集中更改了模型属性,则只会触发单个更改

this.listenTo(this.model, 'change', this.renderOperation);
但是如果您仍然希望侦听属性上的多个更改事件,并且这些更改事件只触发一次。在设置值并触发属性更改事件时,您可能会使用hack来传递{silent:true}。有点黑

var Operation = Backbone.Model.extend({

    defaults: function () {
        return {
            sign: '-',
            value: '0000',
            index: 0
        }
    }
});
var operation = new Operation();

var OperationView = Backbone.View.extend({

    el: '#operation',

    initialize: function () {
        this.listenTo(this.model, 'change:sign change:value', this.renderOperation);
        this.renderOperation();
    },

    renderOperation: function () {
        console.log('rendered once');
        this.$el.html(this.model.get('sign') + this.model.get('value'));
    }
});
var operationView = new OperationView({
    model: operation
});

setInterval(function() {
    var newValue = parseInt(operation.get('value'), 10);
    newValue += 500;
    newValue += '';
    operation.set({ 'sign': '+', 'value': newValue }, {silent: true});
    operation.trigger('change:sign')
}, 1000);

谢谢你的帮助,但不幸的是,这并不能回答我的问题。我想听听模型的多个特定属性的变化。在您的示例中,我的视图将在任何属性更改时更新,但我不希望在我的索引属性更改时更新我的视图。无论何时在模型上设置索引,您都可以传递silent:true属性。。所以它不会触发更改事件。否则,您可以使用我提供的选项2,该选项在设置属性后触发事件,但收听“change:sign change:value”,更改特定属性上的事件。编辑得好,这正好回答了我的问题。解决方案并不漂亮,但考虑到我设置的相当挑剔的场景,这是可以预料的。非常感谢@杰克逊。。很高兴能提供帮助:谢谢你的帮助,但不幸的是,这并不能回答我的问题。我想听听模型的多个特定属性的变化。在您的示例中,我的视图将在任何属性更改时更新,但我不希望在我的索引属性更改时更新我的视图。无论何时在模型上设置索引,您都可以传递silent:true属性。。所以它不会触发更改事件。否则,您可以使用我提供的选项2,该选项在设置属性后触发事件,但收听“change:sign change:value”,更改特定属性上的事件。编辑得好,这正好回答了我的问题。解决方案并不漂亮,但考虑到我设置的相当挑剔的场景,这是可以预料的。非常感谢@杰克逊。。很高兴能够帮助: