Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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

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_Coffeescript - Fatal编程技术网

Javascript 向对象添加主干事件,不注册;关于;修改时的事件

Javascript 向对象添加主干事件,不注册;关于;修改时的事件,javascript,backbone.js,coffeescript,Javascript,Backbone.js,Coffeescript,我可能误解了主干中的事件系统,但是当我尝试下面的代码时,什么也没有发生。当我向主干添加新属性时,它是否应该触发某种更改、更新或重置事件。事件扩展对象?就像模型一样 咖啡脚本: 上面的代码在一个JSBin中 我尝试使用对象。set,或者直接应用它,而不是在子对象中,但现在还没有。有什么想法吗 非常感谢:)您混淆了带有事件的视图/模型/集合中的.get和以及其他功能 例如,主干网将如何触发上的更改事件。set: set: function(attr, value) { this.attribut

我可能误解了主干中的事件系统,但是当我尝试下面的代码时,什么也没有发生。当我向主干添加新属性时,它是否应该触发某种更改、更新或重置事件。事件扩展对象?就像模型一样

咖啡脚本: 上面的代码在一个JSBin中

我尝试使用
对象。set
,或者直接应用它,而不是在子对象中,但现在还没有。有什么想法吗


非常感谢:)

您混淆了带有事件的视图/模型/集合中的
.get
以及其他功能

例如,主干网将如何触发
上的更改事件。set

set: function(attr, value) {
  this.attributes[attr] = value;
  this.trigger('change:' attr, ...);
}
代码比这要复杂一点,但它实际上就是这么做的。没有魔法。主干网没有你所期望的“神奇”的对象观察功能,但这很有意义,但超出了回答问题的范围

抱歉,我不知道如何在CoffeeScript中编写,您的jsbin中有两个错误,但下面是一个普通JavaScript的示例:

var ItemModel = function() {
    this.items = {}; // It is important this is created in instance-scope.
    this.initialize();
};

_.extend(ItemModel.prototype, Backbone.Events, {
    initialize: function() {},

    set: function(attr, value, options) {
        options = options || {};
        var oldValue = this.items[attr];
        this.items[attr] = value;

        if (!options.silent) {
            this.trigger('change', attr, value, {
                oldValue: oldValue
            });
            this.trigger('change:' + attr, value, {
                oldValue: oldValue
            });
        }
    },

    get: function(attr) {
        return this.items[attr];   
    }
});

ItemModel.extend = Backbone.Model.extend;

var MyImplementationOfItem = ItemModel.extend({
    initialize: function() {
        this.on('change', this.onItemChange);   
    },

    onItemChange: function(attr, value, options) {
        alert(attr + ' changed to ' + value + ' from ' + options.oldValue);  
    }
});

var myImplementationOfItem = new MyImplementationOfItem();

// Wait 4s then trigger it.
setTimeout(function() {
    myImplementationOfItem.set('hello', 'world');
}, 2000);

setTimeout(function() {
    myImplementationOfItem.set('hello', 'universe');
}, 4000);
小提琴:


请注意,这是对视图/模型/集合中已有的get和set的简化重新实现。我们鼓励您改用它们

谢谢你的回答-我以为它会继承变化事件,但我想不会。如果你不介意我问的话,有什么解决办法?在添加新属性时只需启动obj.trigger()?我是否必须使用
set()
?我想如果我手动触发事件,我使用set还是直接修改对象都无关紧要,是吗?是的,你必须通过
代理。set
我现在就举个例子,为编辑干杯-我将在周一(现在是啤酒时间!)仔细查看,然后回复/投票/接受。从简单的一瞥中,我不禁想知道是否只是将我需要的数据建模为一组模型。您可以忽略jsbin中的错误;它将其转换为javascript而不是coffeescript!香草js当然不错,我只是喜欢语法糖;)再次感谢@MattFletcher没问题-是的,我建议使用backbone的系列和型号,除非你有很好的理由不这么做。享受啤酒吧!最后,通过使用模型和集合,我让一切都正常工作了。这是一个遗憾,因为仅仅在一个简单的对象上利用事件的力量是很好的,但是这样做还是更好的,因为它使一切都更加健壮。谢谢你的帮助,多米尼克!
var ItemModel = function() {
    this.items = {}; // It is important this is created in instance-scope.
    this.initialize();
};

_.extend(ItemModel.prototype, Backbone.Events, {
    initialize: function() {},

    set: function(attr, value, options) {
        options = options || {};
        var oldValue = this.items[attr];
        this.items[attr] = value;

        if (!options.silent) {
            this.trigger('change', attr, value, {
                oldValue: oldValue
            });
            this.trigger('change:' + attr, value, {
                oldValue: oldValue
            });
        }
    },

    get: function(attr) {
        return this.items[attr];   
    }
});

ItemModel.extend = Backbone.Model.extend;

var MyImplementationOfItem = ItemModel.extend({
    initialize: function() {
        this.on('change', this.onItemChange);   
    },

    onItemChange: function(attr, value, options) {
        alert(attr + ' changed to ' + value + ' from ' + options.oldValue);  
    }
});

var myImplementationOfItem = new MyImplementationOfItem();

// Wait 4s then trigger it.
setTimeout(function() {
    myImplementationOfItem.set('hello', 'world');
}, 2000);

setTimeout(function() {
    myImplementationOfItem.set('hello', 'universe');
}, 4000);