2

我有一个 UI 控制器,为简单起见,您可以将其视为文件夹树,您可以在其中使用复选框选择多个文件夹。选择保存在模型中,并且“保存时”很少触发一些动作。

出于可用性原因,我们希望使用同一控制器的两种不同的可视化。在某些布局中,两个 UI 控制器可以同时存在,而在另一些布局中,一次只能存在一个。

如果能够在 2 个 UI 控制器中重用相同的集合实例,那就太好了。

我可以很容易地在一个模块中做到这一点,但是我应该如何构建代码以使其在不同的模块中工作?我正在考虑拥有一个带有模型和集合类的模块,一个带有 View1 的模块,另一个带有 View2 的模块,但是哪里是放置集合实例并使其与世界其他地方通信的最佳位置。

在 Marionette 中与两个或多个视图共享主干模型/集合实例的最佳实践是什么?

4

1 回答 1

3

一种方法是将您的实体(模块/集合)放在一个单独的模块中,并让您的各种模块请求它们。

实体模块示例(带有集合定义和请求处理程序):https ://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/entities/contact.js#L89

请求集合的示例(第 7 行):https ://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/list/list_controller.js#L7

在您的情况下,如果需要,可以重复使用相同的实例。但是请确保您有一些适当的机制来显示相当新鲜的数据(即在服务器上获取集合以获取最新数据)。

您可以使用 javascript 的闭包机制来执行此操作,例如:

ContactManager.module('Entities', function(...){
  var contacts = new Entities.ContactCollection(...);
  contacts.fetch();

  ContactManager.reqres.setHandler("contact:entities", function(){
    return contacts;
  });

  ContactManager.commands.setHandler("contact:entities:update", function(){
    return contacts.fetch();
  });
});

然后,在您的应用程序中,您将ContactManager.request("contact:entities")用于获取联系人,并且ContactManager.execute("contact:entities:update").

请求和命令之间的区别基本上是语义上的:从应用程序的另一部分请求数据,而不是命令完成一些工作。

使用请求-响应可以更好地设计您的应用程序(松散耦合、封装)。将数据附加到App.SomeNamespace.mycollection也可以(在某些情况下我已经这样做了),但它会导致紧密耦合,破坏封装,我不建议将它用于大型应用程序。

于 2013-07-11T21:25:19.297 回答