如何在Marionette.CompositeView中使用modelEvents

时间:2013-11-05 07:14:35

标签: javascript backbone.js marionette

我开始学习Marionette.View概念。为此我创建了具有1个属性的模型并指定了默认值。

我的html文件中有下拉列表。每当它发生变化时,它会触发一个函数名myfunction。在myFunction内部我改变了模型属性值。

每当属性值自动更改时,它会触发另一个函数。我在Marionette.CompositeView内写的那个事件。但是它没有工作。

之前我使用myModel.on做了同样的事情,但它工作得很好。但它在modelEvents中无效Marionette.CompositeView

让我们检查以下代码。

var mymodel=Backbone.Model.extend({
defaults:{
    "name":"oldValue"
}
});
var mymodelObj=new mymodel();
//marionette.View code
var backView=Backbone.Marionette.CompositeView.extend({
events:{
    "change #pop1":"myFunction"
},
myFunction:function(){
    mymodelObj.set({name:"updatedValue"})
},
modelEvents:{
    "change:name":"myFunction1"
},
myFunction1:function(){
    alert("Hi");
}
 });
//creating instance
var backViewObj=new backView({el:$("#sidebar")});

我该如何解决这个问题。

现在我正在尝试了解Marionette.js在我的Backbone应用程序中的用途。

2 个答案:

答案 0 :(得分:0)

如果我没弄错,模型不会附加到您创建的视图中。对于要触发的modelEvents,CompositeView中应该有一个model属性。为此,您应该在初始化CompositeView期间指定模型;

var backViewObj=new backView({el:$("#sidebar"), model : mymodelObj});

答案 1 :(得分:0)

要做到这一点,虽然您需要在创建backView时传递模型,如下所示:

var backViewObj = new backView({ el:$("#sidebar"), model: myModel });

Marionette通过覆盖delegateEvents来完成此操作,Backbone.View调用其构造函数并将modelEvents对象委托给模型:

Marionette.bindEntityEvents(this, this.model, Marionette.getOption(this, "modelEvents"));

根据您上面的评论,我认为您不清楚Backbone.Marionette在询问如何传递更多模型实例时提供的不同类型的视图。当我开始使用木偶时我也不清楚。


Marionette.ItemView 代表单一型号。

Marionette.CollectionView 代表一个集合,并为集合中的每个模型呈现Marionette.ItemView。它无法渲染模板。

Marionette.CompositeView 表示模型和集合(树结构中的叶和分支)。这适用于递归数据结构,尽管您可以使用CompositeView来呈现模板(如表头等),并使用itemViewContainer将itemView放在特定元素中。

如果您希望CompositeView能够渲染多个模型,则需要将模型集合传递给CompositeView而不是单个模型: