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
Backbone.js 牵线木偶:关于模型属性更改的问题(事件未触发?)_Backbone.js_Marionette - Fatal编程技术网

Backbone.js 牵线木偶:关于模型属性更改的问题(事件未触发?)

Backbone.js 牵线木偶:关于模型属性更改的问题(事件未触发?),backbone.js,marionette,Backbone.js,Marionette,这里描述的应用程序不是真正的应用程序,只是为了演示问题,并按照David Sulc的书中描述的contactmanager应用程序的精神创建 上图中的应用程序可以执行以下操作: -启动时,仅显示区域1 -用户可以上传一张图片,这也会创建收藏中的第一个联系人。 -上传完成后,区域2和区域3将变为活动状态。 -区域2允许用户裁剪图像并更改联系人属性(姓名/年龄等) -区域3显示所有已创建联系人的集合视图,并显示创建新联系人的按钮。 -区域3在每个条目上都有一个编辑,该编辑应在上面的视图中加载联系人

这里描述的应用程序不是真正的应用程序,只是为了演示问题,并按照David Sulc的书中描述的contactmanager应用程序的精神创建

上图中的应用程序可以执行以下操作:
-启动时,仅显示区域1
-用户可以上传一张图片,这也会创建收藏中的第一个联系人。
-上传完成后,区域2和区域3将变为活动状态。
-区域2允许用户裁剪图像并更改联系人属性(姓名/年龄等)
-区域3显示所有已创建联系人的集合视图,并显示创建新联系人的按钮。
-区域3在每个条目上都有一个编辑,该编辑应在上面的视图中加载联系人。
-当要添加第二个(或更高版本)联系人时,区域2将禁用,直到上传新图像

技术方法
-有联系人模型和联系人模型。
-由于我不更改区域中的视图,因此我不打算使用路由器。
-有一种方法可以跟踪当前处于活动状态的模型

代码

// File: js/app.js  

// Define application  
var ContactManager = new Marionette.Application();

// Define regions
ContactManager.addRegions({
  firstRegion: "#first-region",
  secondRegion: "#second-region",  
  tirdRegion: "#third-region"
});

// Itemviews (usually in modules, but for short it's here)
var region1View = Marionette.ItemView.extend({
    template: "#a-template",
    model: ContactManager.request("contacts:active");
});  
ContactManager.firstRegion.show(region1View);

免责声明:可能有一些语法错误,但这是半伪代码

现在,例如,如果我在任何其他模块中执行以下操作(例如,当图像已上载且我希望在当前活动模型中设置文件名时):

问题
现在,当我执行后者时,更改(console.log)事件不会触发。此外,也引用此activeModel的ItemView不会更新。你知道为什么会这样吗

设计问题

这是设计不需要路由器的应用程序的正确方法吗(或者这也是一个错误的假设);或者我应该采取另一种方法吗?

尝试以下模型定义:

Entities.Contact = Backbone.Model.extend({
    defaults: {
        fileName: '',
        name: ''
    },
    initialize: function() {
        this.on("change", function(){
            console.log("model changed");
        }
    }
});

主干模型没有
change
属性:您需要在初始值设定项中注册回调函数。

谢谢您的回复!虽然这可能会解决模型上的更改事件的问题,但您知道为什么ItemView不更新以反映属性中的更改吗?很可能是因为您的item view是集合视图的一部分。集合视图仅绑定到“添加”、“删除”和“重置”集合事件。如果它的一个项目视图应该在其他时间重新提交,您需要自己连接事件侦听器。好的,项目视图似乎不是collectionview的一部分,请参阅app.js。但是,模型是从集合中获取的,这可能是问题所在吗?我刚刚向itemView添加了以下属性:modelEvents:{change:'render'};这实际上可以在模型更改时工作并更新itemView。这是正确的行为吗?因为我期望itemView在模型属性发生更改时自动更新。是的,您需要指出它响应的事件。
 var activeModel = ContactManager.request("contacts:active");
 activeModel.set("fileName","image.png");
Entities.Contact = Backbone.Model.extend({
    defaults: {
        fileName: '',
        name: ''
    },
    initialize: function() {
        this.on("change", function(){
            console.log("model changed");
        }
    }
});