2012-06-28 156 views
1

我有两种不同的方式在我的网站上显示我的模型,我用不同的视图处理它们。触发从一个视图到另一个视图的事件

但是,我希望能够以某种方式连接这些视图,以便某个事件发生在某个特定模型的某个视图上时,它也可以触发另一个视图上的事件。

为了简单起见,我们假设我有一个集合,并用两个视图表示集合,这两个视图会生成相同的ul列表。 (实际上,观点当然不同)。

HTML

<ul class="view-a"> 
    <li class="subview-a">Model 1</li> 
    <li class="subview-a">Model 2</li> 
</ul> 

<ul class="view-b"> 
    <li class="subview-b">Model 1</li> 
    <li class="subview-b">Model 2</li> 
</ul> 

骨干

viewA = Backbone.View.extend({ 
    tagName: 'ul', 
    className: 'view-a', 
}); 

viewB = Backbone.View.extend({ 
    tagName: 'ul', 
    className: 'view-b', 
}); 

subViewA = Backbone.View.extend({ 
    tagName: 'li', 
    className: 'subview-a', 
    events: { 
     'mouseover':'over', 
    }, 
    over: function() { 
     console.log('mouse over on A'); 
    } 
}); 

subViewB = Backbone.View.extend({ 
    tagName: 'li', 
    className: 'subview-b', 
    events: { 
     'mouseover':'over', 
    }, 
    over: function() { 
     console.log('mouse over on B'); 
    }, 
}); 

你可能会问:为什么不具有相同的子视图?在这个例子中,这两个子视图都是li,但在实际实现中并没有。

那么如何在subview A上徘徊时触发subview B上的鼠标悬停事件,反之亦然?

+1

如果在两个视图中都呈现相同的模型,也许你可以通过模型?可以在模型中注册两个视图,并且当一个模型中发生事件时,使用'this.model.get('subview-b')''来访问另一个视图。 – jackwanders

+0

都是由相同骨干模型代表的子视图中的对应模型? – jakee

+0

是的!相应的型号 – AlexBrand

回答

2

与Backbone的事件模型进行通信。当我说这些时相信我,但是在使用Backbone时,请尝试选择模块化方法。换言之,即使可能有关,每个观点都不应该依赖于另一种观点。它不仅使测试变得非常困难,而且也使其成为调试和导致意大利面代码的噩梦。看看this article。它解释了视图如何使用Backbone的事件模型与对方进行通信。您应该熟悉PubSub模式。 This question也有关系。

更新!所以,如果我拿你的例子

var vent = _.extend({}, Backbone.Events); 

subViewA = Backbone.View.extend({ 
    tagName: 'li', 
    className: 'subview-a', 
    initialize: function() { 
     vent.on('my-event', this.over, this); 
    }, 
    events: { 
     'mouseover':'over', 
    }, 
    over: function(dataRecieved) { 
     console.log('mouse over on A'); 
    } 
}); 

subViewB = Backbone.View.extend({ 
    tagName: 'li', 
    className: 'subview-b', 
    events: { 
     'mouseover':'over', 
    }, 
    over: function() { 
     vent.trigger('my-event', "data you would like to pass"); 
    }, 
}); 
+0

这会绑定到集合的特定模型吗?它看起来并不像它。我认为这会导致所有子视图运行“over”。我希望它是模型特定的 – AlexBrand

+0

我不确定你的子视图意味着什么运行结束?如果你正确处理你的观点,你应该没有绑定和'僵尸视图'的问题。我的意思是,如果您希望它是特定于模型的,请将您的视图绑定到模型更改,重置和所有事件。但是,导致另一个视图对另一个视图中的悬停/覆盖事件做出反应,我没有看到比上面列出的更好的方法。如果有我的耳朵。 – TYRONEMICHAEL

相关问题