Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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 视图不';t收听Model Event Backbone.js_Javascript_Backbone.js_Backbone Views_Backbone Events - Fatal编程技术网

Javascript 视图不';t收听Model Event Backbone.js

Javascript 视图不';t收听Model Event Backbone.js,javascript,backbone.js,backbone-views,backbone-events,Javascript,Backbone.js,Backbone Views,Backbone Events,由于某些我无法理解的原因,我的观点并没有听取事态的发展。模型正在改变,但视图似乎并不承认这些改变。这是我的密码 var playerSet = 1; var bone = function(){ var app = {}; app.BoardModel = Backbone.Model.extend({ defaults: function(){ return{ board:[0,0,0,0,0,0,0,0,

由于某些我无法理解的原因,我的观点并没有听取事态的发展。模型正在改变,但视图似乎并不承认这些改变。这是我的密码

var playerSet = 1;
var bone = function(){
    var app = {};
    app.BoardModel = Backbone.Model.extend({
        defaults: function(){
            return{
                board:[0,0,0,0,0,0,0,0,0],
                allDisabled: false,
                p1Score: 0,
                p2Score: 0
            }
        },
        setSlot: function(slot, ct){
            var b = this.get("board");
            b[slot] = ct;
            this.set("board", b);
            console.log("CHANGED");
        }
    });
    app.Board = new app.BoardModel;
    app.BoardView = Backbone.View.extend({
        el: $("#ttt-board"),
        initialize: function(){
            this.listenTo(app.Board, "change", this.renderBoard);
        },
        renderBoard: function(){
            console.log("HELLO THERE");
        }
    });
    var tictac = new app.BoardView;
    app.Board.setSlot(0,1);
};
bone();
当我启动
setSlot
时,模型会随着控制台输出
的更改而更改,但是我从未看到调用renderBoard函数


这可能非常简单,但我无法理解。

您的问题是,您只更改数组对象的内部组件,而不是模型上的属性。即使您在模型上手动调用
set
,这也不是实际的更改,
set
逻辑仅在新旧值之间的相等性检查失败时触发更改事件(在您的情况下不会)

既然您正在调用自定义函数,为什么不使用自定义事件呢

setSlot: function(slot, ct){
  this.get("board")[slot] = ct;
  this.trigger("custom:change:board", slot, ct);
}
现在收听自定义事件(或两者),而不仅仅是
change

initialize: function(){
  this.listenTo(app.Board, "change custom:change:board", this.renderBoard);
}

好的,调用
this.trigger(“change”)
应该起作用吗?还是别的什么?是的,你绝对可以直接触发改变<代码>此.trigger('change',this,options)我倾向于避免这样做,因为有多个处理程序正在侦听
更改
事件是很常见的,当事件处理程序做一些古怪的事情时,您可能会感到惊讶,因为手动设置
更改
事件时,
设置
在引擎盖下管理的状态没有按预期设置触发。我对自定义事件解决方案非常满意
this.trigger(“change”)
解决了我的问题,但我认为您的解决方案要优雅得多。