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