问题标签 [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 投票
1 回答
1221 浏览

events - 具有多个视图的 MVP:以正确的方式发送事件

我第一次尝试使用 Passive View 实现 MVP,但我有点困惑谁在这种模式下通知谁。我知道如果视图发生更改,视图会通知演示者,而演示者又会通知其他所有人(其他视图和模型)。

现在,就我而言,我有多个视图,而且我还有一个可以在 UI 之外更改的模型。可能会发生以下两种情况:

  1. View[i] 发生变化并通知 Presenter。Presenter 需要通知所有其他视图和模型,但不需要通知 View[i]。此外,视图和模型都不能向 Presenter 发送更改通知,即使它们刚刚被修改(否则会出现无限循环的事件)。

  2. 模型发生变化并通知 Presenter。Presenter 需要通知所有视图,而不是 Model。但是即使它刚刚被修改,任何视图都不会向 Presenter 发送更改通知。

主持人将如何通知谁,谁不通知?模型如何知道它是否需要发送更改通知?毕竟,它只是被修改,但它不一定知道是谁。

一种可能性是让每个人(模型、视图和演示者)自由地发送更改通知,但在通知中存储对最初触发更改的对象的引用(从而将通知封装在事件对象中)。然后,每个对象仅在他不是更改的原始触发器时才发送通知。但是有没有更简单、更清洁的方法呢?

0 投票
2 回答
1074 浏览

c# - 如何在 C# Winforms 中正确实现具有被动功能的模型视图演示器?

我现在正在研究设计模式,我对这个模型视图演示器相当陌生,虽然我已经在 asp.net mvc 方面有经验,但我正在尝试在 winforms 中实现 mvp。

文本框中的字符串将使用基于组合框的算法进行排序。现在,当我单击按钮时,它会引发空引用异常

这是用户界面:在此处输入图像描述

这是我的课程和代码:

我没有包含模型的代码和包含排序函数的类以保持这篇文章的简短。我遇到的问题是,单击按钮时会引发空引用异常错误,这是我已经坚持了几个小时的问题。

先生/女士,您的回答会很有帮助。谢谢++

0 投票
1 回答
176 浏览

css - 通过 Presenter 管理 View 中的错误和 CSS

我在项目中实现的 MVP 模型是 Passive MVP。演示者具有对视图的引用。此外,presenter 有一个 Display 接口,视图必须遵守。

我当前的显示界面如下 -

这里的痛苦是用于设置/清除输入错误消息的方法。每个setXXXError()由 View 实现的都会使相应的ErrorWidget可见,并且可能还会突出显示相应的InputWidget(通过将其标记为红色或其他东西)。相反,每个clearXXXError()方法都会隐藏对应的ErrorWidget,并从对应的 中移除高亮InputWidget。这样,presenter 就不必明确地处理 CSS 管理,从而将自己与 CSS 的变化脱钩。只有视图必须担心它。

但是,这种做法最终导致接口中有太多与错误相关的方法。

我想到的另一种方法是ErrorWidget在界面中公开 s 。但是,GWT 没有HasCss-type 接口,我必须要么显式指定小部件类型(例如,标签),要么使用IsWidget接口(这将再次公开整个小部件,而不仅仅是其 CSS 属性)。此外,在这种方法中,我必须在演示者中明确指定 CSS 修改。

我的方法有更好的选择吗?还是我所做的已经足够好?我也希望我目前的方法有任何改进。

0 投票
2 回答
1375 浏览

java - 使用 Mockito 对具有被动视图的演示者进行单元测试

问题

“管理”被动视图的演示者订阅该视图中发生的事件(例如按钮单击),并且不直接将处理这些事件的方法公开为公共接口。我不喜欢将这些方法公开仅用于单元测试的想法,因为它闻起来像是暴露了内部实现细节。因此,调用该事件处理代码变得非常重要。

我的解决方案

视图模拟必须“拦截”事件订阅,然后使用相应的拦截侦听器来调用事件处理代码。我的实现包括一个实用程序类,它实现了 Mockito API 的 Answer 接口

事件订阅的拦截方式如下

创建 SUT 实例后...

...我获得了听众

在“ Act ”部分我调用了监听器的事件处理方法

问题

我对 Java 中的单元测试很陌生,所以我想知道是否有更优雅的方式来测试演示者代码。当前的“排列”部分相当臃肿,似乎在可读性方面并不出色。

编辑: 应乔纳森的要求添加简化的 SUT 代码。它说明演示者没有任何公共方法(构造函数除外),并订阅视图事件。

0 投票
2 回答
182 浏览

c# - Passive View - 查看具体逻辑

假设我想实现被动视图设计模式。我有一个包含列表框的视图(将来我可能会与列表视图或其他东西交换)。现在,使用被动视图应该使视图尽可能地愚蠢。可以说我想更改选择。我将把这个逻辑放在演示器中,因此我在视图界面中添加一个属性来获取和设置视图列表框的 SelectedIndex 属性。但是,如果我将来想用列表视图交换列表框,我就有麻烦了,因为列表视图没有 SelectedIndex 属性。然后我是否在视图中实现一些逻辑(基本上使它不那么愚蠢),例如:

或者我是否在视图和演示者之间放置了某种适配器。什么是最合乎逻辑的方法?

0 投票
2 回答
1412 浏览

c# - MVP:被动视图(使用 EF)和层

我正在使用 MVP 创建应用程序:被动视图和 EF(模型优先)。据了解,我有一个演示者直接从通过 EF 创建的 DataContext 获取数据。它看起来像这样:

所以presenter得到一个所有订单的列表,创建一个订单视图模型列表(结合来自不同表的数据,即上面的地址),然后将视图模型列表发送到视图。

反过来,从视图中检索数据以编辑或添加到数据库时,情况几乎相同:

1) EF(通过 EF、DataContext 等创建的实体)可以被视为 DAL 吗?它应该在自己的项目中吗?

2)我猜演示者不应该像那样访问 DataContext ,而是访问两者之间的另一层,对吧?那是服务层,业务层还是两者兼而有之?

3)我所说的视图模型实际上是视图模型还是其他东西?我只是想让我的术语正确。

编辑:

4) 我阅读了一些关于向 EF 生成的实体添加业务逻辑的建议,但这对我来说听起来不太正确。我应该在 EF 之上的单独业务层中创建业务对象吗?这意味着我将拥有 Order(由 EF 生成)、OrderBO(业务对象)和 OrderViewModel(要显示的订单)。我将不得不做更多的映射,因为我会添加另一个图层,但它会使演示者更轻。

提前致谢!

0 投票
1 回答
572 浏览

c# - 简单 WinForms 应用程序中的 Passive View MVP 问题

想象一个带有客户列表的简单应用程序:

当用户单击特定客户时,将显示客户数据编辑器窗口:

EditorPresenter必须知道用户选择的客户,但视图不知道客户模型和正确初始化EditorPresenter.

我怎么解决这个问题?

0 投票
2 回答
683 浏览

java - JCheckbox 只通过控制器改变他的状态

普通 JCheckbox 直接对用户输入做出反应并设置或取消设置刻度。在此之后调用 MouseListener。我想要实现的是 JCheckbox 的状态只能由控制器更改。什么是体面的方式来实现这一目标?

我尝试添加一个鼠标侦听器,它会立即再次添加/删除刻度,但这会导致闪烁。

我发现的唯一方法是覆盖 processMouseEvent 方法,但这真的很糟糕......

编辑(我当前的版本):这现在可以工作了。之前错过了调整模型。

0 投票
1 回答
2483 浏览

c# - 如何使用 MVP 和被动视图 Form.ShowDialog()?

概括

我正在 Windows 窗体应用程序中试验 MVP 模式。

我想让我的 Presenters 和 Views 平台不可知,所以如果我想将我的应用程序移植到另一个平台,比如 Web 或移动设备,我只需要使用平台相关的 GUI 实现视图,我的 Presenters 仍然可以独立于平台。

现在我想知道,如何使用 MVP 和被动视图来 ShowDialog()?

到目前为止,据我所知,被动视图不应该知道/关心任何演示者。他们甚至不知道它的存在。因此,根据我的说法,这个问题的答案中提出的解决方案不合适: Refactoring Form.ShowDialog() code to MVP

一些代码示例有助于理解:

ApplicationView

ApplicationPresenter

  1. 这就是我挣扎的地方。ApplicationPresenter 就像 Universer 中的主人,可能通过 和 知道用户身份IAuthenticationView验证IAuthenticationPresenter

IAuthenticationView

IDialogView

IView

IAuthenticationPresenter

IPresenter<V>

0 投票
0 回答
271 浏览

c++ - 使用 FLTK 的 MVP 被动视图方法

我有一个非常基本的问题,尝试将 FLTK 与 MVP Passive View 一起使用,如所述所述。我设法做到了,但我这样做的方式感觉不对。

我有一个Fl_Window, 包含一些小部件和一个Fl_Gl_Window用于 OpenGL 的功能。如您所知,您可以将小部件和东西添加到Fl_Windowbetweenbegin()end(). 当你在这些调用之间直接添加它时,似乎你必须实例化所有东西,所以我得到了类似的东西:(

请查看代码旁边注释中的小“故事”,因为它解释了我在做什么和我想知道在这种情况下这是否可以,或者也许有人可以为我指出更好的解决方案,因为它真的感觉不对。

主文件

查看.h

查看.cpp

GlWindow.h

演示者.h

IView.h 看起来与 IPresenter.h 相同。

因为我想做MVP,两个窗口都是视图(一个View包含另一个)。每个View需要与Presenter和 通信,如序列图中所示FowlerView需要持有对 的引用Presenter反之亦然。所以我在接口头中使用了前向声明。

如前所述,我想知道是否有更好的方法来做到这一点。Fl_Gl_Window也许在此时无需实例化它就可以以某种方式添加。或者也许我的MVP Passive View方法不正确。

我希望我的解释是可以理解的。在此先感谢您的帮助!