我正在使用一个复合视图,其中$ .dialog调用了它的$ el。
然后,合成视图将列出集合中的项目。
现在我已经尝试了多种方式来呈现集合项:在将视图附加到视图之前和之后从视图外部获取,在视图内部获取,从我的服务器脚本预加载集合等等......
一切似乎都有效但发生同样的问题..
一旦复合视图看到这个集合,它就会再次调用它自己的初始化函数......
我完全理解渲染函数将在集合重置或添加时调用...但是初始化???我完全不知道为什么会这样。
showCustomFieldSelect: function(e){
log('triggered');
e.preventDefault();
var cl = new AustApp.Collections.CustomField;
var select = new AustApp.Views.AvailableCustomFieldsList({
el: "#available-custom-fields-popup",
collection: cl
});
cl.fetch();
cl.once("reset", function(){
// this bind was
// previously used for creating the view
// or calling render functions directly
// amongst numerous efforts to debug
}, this);
},
MyApp.Views.AvailableCustomFieldsList = function(){
var AvailableCustomFieldsList = Backbone.Marionette.CompositeView.extend({
template: "#available-contact-list-custom-field-list-js",
tag: "div",
itemView: AustApp.Views.AvailableCustomFieldsListItem,
emptyView: AustApp.Views.EmptyAvailableCustomFieldsListItem,
itemViewContainer: "ul",
templateHelpers: viewHelpers,
initialize: function(){
log('init called'); // called twice?????
this.render();
this.$el.dialog({
title: "Available Custom Fields",
width: '600px',
modal: true,
dialogClass: "round",
});
},
/* stuff */
});
return AvailableCustomFieldsList;
}();
任何帮助,因为我感到很沮丧
答案 0 :(得分:18)
对我来说,这是固定的(经过几个小时的敲击我的头后),但确保 <强>使用:强> 不起作用(init没有任何参数调用两次): 即使我们在声明了两个MyCompView的实例后得到了它,也无关紧要,必须在compsite视图之前声明itemView。ItemView
之前宣布 <{strong> CompositeView
!! < / p>
MyItemView = Marionette.ItemView.extend({ /* STUFF */ })
MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView })
MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView })
MyItemView = Marionette.ItemView.extend({ /* STUFF */ })
答案 1 :(得分:7)
所以我把问题缩小到在复合视图之后声明项目视图的时候,复合视图也包含在另一个复合视图中。
将嵌套的复合视图更改为项目视图可以解决问题,但是...将嵌套的复合视图更改为集合视图会导致集合的itemView不可用的错误
所以将嵌套视图的声明移动到集合视图的声明之上修复它...然后更改它发现嵌套复合视图在声明的顺序正确时起作用。
我认为这应该不那么具有误导性,因为复合视图的双初始化只是简单的混淆,并且应该吐出关于未定义的项目视图的错误,而不是如果可能的话,那就是^ ^ ^
谢谢
答案 2 :(得分:2)
感谢上述解释。
我遇到了同样的问题。如果没有使用Composite视图定义itemView,则每次其集合更改时都会调用其初始化函数。
我通过使用空视图作为项目视图来修复此问题。
(我正在使用我的复合视图用于其他目的,并且不需要项目视图。)
答案 3 :(得分:2)
我想补充一点,当uglfying(最小化)你的JavaScript时,uglifying引擎可能会无序地声明事物(即,可以像@Thomas Hudspith-Tatham和@simbolo提到的那样以相反的顺序声明CompositeView和ItemView)。使用requireJS模块化Backbone.Marionette并优化(编译)代码时,问题更为常见。
不幸的是,除了重新编译代码之外,我不知道一个有保障的修复,这对我有用。
答案 4 :(得分:1)
我正在分享我的经历。这可能对某人有所帮助。
我遇到了类似的问题。 在Initial我认为事件被解雇了两次,但实际上,它被听了两次,导致异常的应用程序行为。
我的事件是从复合视图(一个触发器)触发一次但由于两个Contact控制器实例而被监听两次(2次)。
我修复了确保我只有一个侦听器(一个Controller实例)用于特定行为(在我的情况下打开一个编辑对话框)。
注意。我的应用程序中有多个控制器,我正在使用require加载。