问题标签 [passive-view]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1432 浏览

java - Swing、被动视图和长时间运行的任务

我正在尝试在摇摆中实现基于被动 视图的 gui 系统。基本上我想让我的视图实现(实际上包含摆动代码的部分)最小化,并在我的 Presenter 类中完成大部分工作。Presenter 应该不依赖于 swing,并且应该“运行节目”,即告诉视图要做什么,反之亦然。

在处理长时间运行的任务和线程分离时,我遇到了问题。我希望 GUI 更新在 EDT 上运行,并且演示者逻辑在不同的线程上运行。如果我想让演示者更新 GUI 的某些部分,这很容易,我会这样写:

但是,当 GUI 通知演示者发生了某些操作时,我想切换出 EDT 以在不同的线程中对其做出反应:

由于 actionPerformed 代码是从 EDT 运行的,presenter.buttonPressed 也是如此。我知道 swing 有 SwingWorker 的概念 - 在不同的线程中运行任务,但是看起来我必须将 swing 代码插入到我的演示者中,并且视图正在运行节目。任何想法如何解决这个问题?

0 投票
1 回答
208 浏览

logic - 被动视图和显示逻辑

在 MVC 和 MVP 和类似的模式中,经常有“被动视图”的方法,它尽可能愚蠢(包含尽可能少的逻辑)。这应该有助于单元测试并创建更清晰的视图和模型分离。

我知道这些模式有非常不同的风格,尤其是对 MVP 的理解似乎因文章而异。因此我的问题不是“我如何正确实现这种模式”。

我想改进视图和模型分离并提高应用程序的可测试性。因此,我想采取被动的观点。但我的问题是,你会将显然只与视图相关的逻辑放在哪里?当滚动条移动时,像 textviewer 一样应该滚动文本。你会把这个逻辑放到Presenter中吗?假设 textviewer 具有一些扩展功能。比如在文本段落上设置标记。将其逻辑放入 Presenter 中显然是有意义的。但是,如果它与视图的所有“直接”逻辑(如滚动文本)混合在一起,Presenter 可能会变得非常大,这也不是一个很好的设计。

所以我的问题是在哪里放置被动视图的显示相关逻辑以及在 Presenter 中混合什么功能。

谢谢!

0 投票
3 回答
613 浏览

javascript - JavaScript 中的被动视图

我正在考虑 MVP - JavaScript 中的被动视图模式的实现。在大多数情况下,视图将是简单的 dom 元素,演示者在其中附加事件侦听器。但是当涉及到像基于 JavaScript 的伪选择框、自动建议或 aria 功能这样的小部件时,这应该是 JavaScript 视图类的一部分还是应该改变视图的逻辑是演示者的一部分?我查看了javascriptMVCs 视图,它们似乎只是模板生成的 html,没有任何逻辑。但对我来说,听 html 选择框的演示者和听带有 javascript 逻辑的伪选择框以模仿真实选择框的演示者之间似乎没有什么不同。两者都不应该关心盒子在内部是如何工作的,他们只需要监听 change 事件。

那你怎么看。视图类的工作是什么。

0 投票
2 回答
427 浏览

c# - Model-View-Presenter 和传输大对象

我传统上实现了一个 Model-View-Presenter [Passive View],如下所示:

并且我传统上只在IView接口中使用原始类型(int, string, bool),因为我一直明白您只需要在视图中使用原始类型。在 Repository(例如NHibernate)中,如果我想显示 a 中的项目列表DataGridView,我必须将通用集合(IList<T>)从 Model 传递给 Presenter。这是否违反了仅由原始类型组成的视图背后的规则,或者这在架构上是否可以?

即使我有一个数据传输对象 (DTO),它也更像是一个监督控制器,而不是我试图实现的被动视图样式。

想法??

0 投票
1 回答
3531 浏览

python - MVP:Presenter-Model 通信

我有一个关于 MVP 设计模式中模型和演示者之间通信的设计问题——或者更准确地说,它从被动视图派生而来。

让我们假设以下简单的 GUI 作为示例:我有一个窗口,其中我的视图是一个列表,并且可以打开一个文件对话框来选择一个文件。一旦我完成了我的选择,文件将被附加到列表中。

我的模型将是我打开的所有文件的集合。

想到一个直接的实现(伪python代码):

解决方案 A

在这种情况下,我知道文件已添加到模型中,因此我相应地更新了视图。

另一方面,我可以将文件添加到模型中,然后等待模型通知我已更改并且演示者必须更新视图,如下所示:

解决方案 B

现在,在这种情况下,两种实现都可以正常工作。但是让我们假设模型还监视文件,并且需要在其中一个文件被删除时通知演示者。那么无论如何我都需要这种 onModelChanged() 回调机制。

我现在的问题是:我应该混合使用两种更新视图的方式(A 用于同步更新,B 用于异步)还是按照解决方案 B 中的建议将其全部集中在一个地方?

0 投票
2 回答
18436 浏览

c# - C# WinForms Model-View-Presenter(被动视图)

我正在用 C# 开发一个 WinForms 应用程序。我在 GUI 编程方面的经验有限,而且我必须快速学习很多东西。话虽如此,这就是我正在建造的东西。

请参阅以下链接查看通用 GUI:

图形界面 http://img227.imageshack.us/img227/1084/program0.jpg

现在,我已经做了很多工作,但是在非常糟糕的自治设计模式中。我不知道这个项目会达到一定的规模,因此,是时候进行一些重大的重构了。

我一直在研究关于 GUI 设计模式的大量内容,我希望实现的模式是被动视图(请参阅http://martinfowler.com/eaaDev/PassiveScreen.html)。我正在寻求有关如何将这一切整合在一起的帮助。

背景:

1) 根据用户在“TreeView”中单击的内容,左下角的“列表”将显示可以填充“编辑器”区域的对象列表。这些对象可能是 TextBox 或 DataGridView。用户切换列表以选择他/她想在“编辑器”中看到的内容

2)模型本质上是一个包含数据和配置文件的文件夹。有一个在给定目录上运行的外部程序,创建输出文件/文件夹等。我正在开发的这个程序旨在以用户友好的方式有效地管理/配置这些对象

3)我做事方式的问题是几乎不可能测试,因此转向 MVP-esque Passive View 设计模式

我正在努力使程序独立于视图工作。我找不到任何将更复杂的交互式视图与被动视图模式一起使用的示例。

问题:

1)我是否需要为程序的整个“外观”实现一个大界面/视图,然后为每个 TreeView、Editor、Logger 等实现子接口/子视图?还是有更好的“结构”来做到这一点?

2)当涉及从视图“移交”事件到演示者/控制器(无论您希望使用 WRT 被动视图设计模式的任何术语)时,我应该以什么方式执行此操作?有时我有一些简单的属性需要更新,有时我需要一系列的步骤来展开。

我很想就这个话题提出建议和建议。我搜索了互联网,但没有找到足够的例子来帮助我继续这个项目。

提前致谢!

丹尼尔

0 投票
2 回答
8868 浏览

c# - 如何构建 C# WinForms Model-View-Presenter(被动视图)程序?

我正在设计一个具有以下基本思想的 GUI(类似地模仿 Visual Studio 的基本外观):

  1. 文件导航
  2. 控件选择器(用于选择要在 Editor 组件中显示的内容)
  3. 编辑
  4. 记录器(错误、警告、确认等)

现在,我将使用 TreeView 进行文件导航,使用 ListView 选择要在编辑器中显示的控件,以及使用 RichTextBox 进行 Logger。根据在 TreeView 中选择的内容,编辑器将具有 2 种类型的编辑模式。编辑器可以是用于手动编辑文件内文本的 RichTextBox,也可以是带有拖放 DataGridViews 和子文本框的面板,用于在此面板中进行编辑。

我试图遵循被动视图设计模式,将模型与视图完全分离,反之亦然。这个项目的性质是我添加的任何组件都可以编辑/删除。因此,我需要从一个给定的控制独立到下一个。如果今天我使用 TreeView 进行文件导航,但明天我被告知要使用其他东西,那么我想相对轻松地实现一个新控件。

我根本不明白如何构建程序。我了解每个控件一个演示者,但我不知道如何使其工作,以便我有一个带有控件(子视图)的视图(程序的整个 GUI),这样整个视图以及个人视图都是可替换的反映我的模型的控件。

在被动视图标准应该是轻量级的主视图中,我是否单独实现子视图?如果是这样,假设我有一个接口 INavigator 来抽象 Navigator 对象的角色。导航器将需要一个演示者和一个模型来在导航器视图和主视图之间进行操作。我觉得我在某个地方迷失了设计模式行话。

最相似的问题可以在这里找到,但它没有足够详细地回答我的问题。

有人可以帮我理解如何“构建”这个程序吗?我很感激任何帮助。

谢谢,

丹尼尔

0 投票
3 回答
3312 浏览

c# - MVP Passive View - 将视图数据和模型数据分开

我已经使用被动视图模式实现了一个 MVP 三元组——即视图只包含简单的 getter 和 setter。但是,我无法分离视图数据和模型数据。特别是在处理视图状态的变化时。

三元组用于使用户能够从列表中选择一个部分。零件列表由模型提供,每个零件都由唯一的 id 唯一标识。

假设这些部分看起来像这样:

视图向用户显示列表并允许他们选择一个部分

该列表显示在 DataGridView 中,并通过单击 dataGridView 中的一行来选择一个部分。

ID 不会显示给用户,电压也不会显示给用户,因此模型会创建一个仅包含 partCode 和描述的 DataTable。此 DataTable 由演示者分配给视图上的一个属性,该属性映射到 DataGridView 的 DataSource 属性。

到现在为止还挺好。View 在 DataGridView 中显示过滤后的数据。

我遇到的问题是返回用户选择的部分。

视图不知道唯一 ID,因为它不显示,并且不能保证其他信息是唯一的 - 因此无法唯一标识所选部件。

本质上,我正在尝试将视图数据(选定的行)转换为模型数据(选定的部分),而无需使用其他数据的一个组件。

到目前为止,我有以下解决方案:

1)视图被传递一个包含ID的DataTable,然后过滤显示,使其不显示给用户。然后返回所选行的 ID 就很简单了。这里的问题是我现在已经用未经测试的逻辑(显示过滤)污染了视图。

2) 视图返回行索引,模型将该索引与原始数据中的一行进行匹配。这意味着确保视图中的顺序永远不会改变,这虽然可能会限制视图如何显示(和操作)数据。这也会用视图数据(行索引)污染模型。

3) (2) 的变体。创建一个适配器对象以位于演示者和视图之间。将行到 ID 转换代码从模型移动到适配器。演示者然后处理 dataGridAdapters 部分更改事件。

目前我正在向 3 学习,因为它是可测试的,将逻辑排除在视图之外,并将数据视图排除在模型和演示者之外。

您将如何解决这个问题 - 有没有更好的解决方案?

0 投票
2 回答
1818 浏览

java - MVP 被动视图 - 复合视图和复合演示者

我找到了 M. Fowler 关于被动视图模式的文章。我想在我的应用程序中应用它。我将 Swing 用于 UI。我花了几个小时搜索如何实现它的教程或示例,但没有找到太多有用的东西。有人可以帮助理解设计或在这里提供好的例子吗?通过 MVP 中的“M”,我理解“域模型”。

0 投票
1 回答
978 浏览

javascript - Javascript MVP(被动视图)库

在大型 GWT 上工作,让我爱上了 GWT 附带的 MVP 模式。基本上它是一个被动视图,控制器知道所有业务逻辑,并且视图尽可能转储。这样做的好处是您可以轻松更改视图,并且可以快速运行单元测试,因为不涉及 DOM。

我已经阅读了有关backbone.js 的文章,但似乎整个逻辑都在视图中,并且视图和业务逻辑没有真正的解耦。但也许我错了。

所以我想知道是否有一个与 GWT 具有相同方法的 JavaScript 库。