【问题标题】:backbone view triggers a global event主干视图触发全局事件
【发布时间】:2012-09-05 13:34:42
【问题描述】:

最近有很多问题,虽然我不能说它们正在加快我的发展步伐。而只是让我感到不舒服。需要把我的头包起来。

在一个不错的世界主干视图中通知底层模型,模型触发事件。将自身更新视为对事件的响应。

如果视图触发事件并且另一个视图响应此事件是否合法。底层模型甚至可能对此一无所知?

假设我有一个购物车是一个集合,现在我有一个视图,称之为一瞥视图,其中包含项目计数和总成本,其中包含查看购物车详细内容的链接。

所以用户单击视图触发事件的链接但是这会被控制器或模型以外的任何其他方捕获。

将底层模型排除在游戏之外,是吗?合法的?

【问题讨论】:

  • 模型通常应该代表您的数据,如果您的数据不需要更改或响应事件做任何事情,那么我不明白为什么绕过它应该是一个问题。请记住,您实际上并不总是需要模型,拥有没有模型的视图是完全可以接受的。
  • 授予杰克。正如我在下面已经提到的,这两个视图共享同一个集合。所以这是两个意见直接交流的关注点。无论如何,你的观点是有道理的。

标签: javascript-events backbone.js


【解决方案1】:

Backbone 的优点在于它的灵活性,它不需要您严格遵守特定的架构。

所以一个视图触发一个事件是没有问题的,另一个视图直接响应这个事件而不改变模型上的任何东西。

不过,需要提出的问题是实现架构最简洁的方式是什么。

根据您所描述的情况,我认为,我会使用一个全局事件对象来让两个视图相互通信。

这是一些示例代码

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

var GlimpseView = Backbone.View.extend({
  events: {
    'click a.see-verbose': 'onSeeVerboseClick'
  },

  onSeeMoreClick: function() {
    globalEvents.trigger('seeVerbose', this.model);
  }
});

var VerboseView = Backbone.View.extend({
  initiliaze: function() {
    globalEvents.on('seeVerbose', onSeeVerbose, this);
  },

  onSeeVerbose: function(model) {
    // code to render the verbose view
  }
});

【讨论】:

  • 感谢保罗。我的实现与您的示例非常相似。我的主要关注点来自这两个视图,它们将公共集合共享为购物车。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多