Emberjs多个奥特莱斯和泄漏collectionView

时间:2013-02-11 09:54:00

标签: javascript ember.js handlebars.js ember-old-router

我正在尝试在Ember中创建一个应用程序的一部分,其中视图中将有多个插座,并且每个插座将连接到collectionView。问题似乎是第二个出口变得“散落”了第一个变量。

现在我正在做的事情更多,但是: Here's a fiddle简化问题。

有3个把手模板: 申请

{{outlet dogs}}
{{outlet cats}}

Cat:{{view.content.name}}

Dog:{{view.content.name}}

应用程序模板中的插座已连接:

index:Em.Route.extend({
    route:'/',
    connectOutlets:function(router, context){

        router.get('applicationController').connectOutlet('cats', 'catsCollection');
        router.get('applicationController').connectOutlet('dogs', 'dogsCollection');
    }, 
})

然后对于猫和狗, 我创建了一个存储内容的对象:

App.Cats = Em.Object.create({
    content:[{name:"Russian Blue"}, {name:"British Short Hair"}, {name:"Domestic Tabby"}]
});

集合视图:

App.CatsCollectionView = Em.CollectionView.extend({
    content:App.Cats.content,
    itemViewClass:'App.CatsView'
});

要呈现的集合视图的视图类:

App.CatsView = Em.View.extend({
    templateName:"cats",
    init:function(){

    }
});

但结果将显示第二个插座的内容在第二个插座中重复出现:

Dog:Huski
Dog:Samoid
Dog:Elkhound
HuskiSamoidElkhound
Cat:Russian Blue
Cat:British Short Hair
Cat:Domestic Tabby

那么这是如何发生的,又如何解决?

1 个答案:

答案 0 :(得分:0)

您没有覆盖init函数。默认情况下,View会调用init本身并执行一些你看不到的奇特魔法。通过声明该函数,您已阻止该函数被调用。如果您确实想要添加init功能,那么您应该在功能顶部调用this._super();,如更新的jsfiddle中所示。

this._super();所做的是从继承的对象(在本例中为'View'对象)调用init函数,然后执行您的附加代码。