问题标签 [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.
events - 具有多个视图的 MVP:以正确的方式发送事件
我第一次尝试使用 Passive View 实现 MVP,但我有点困惑谁在这种模式下通知谁。我知道如果视图发生更改,视图会通知演示者,而演示者又会通知其他所有人(其他视图和模型)。
现在,就我而言,我有多个视图,而且我还有一个可以在 UI 之外更改的模型。可能会发生以下两种情况:
View[i] 发生变化并通知 Presenter。Presenter 需要通知所有其他视图和模型,但不需要通知 View[i]。此外,视图和模型都不能向 Presenter 发送更改通知,即使它们刚刚被修改(否则会出现无限循环的事件)。
模型发生变化并通知 Presenter。Presenter 需要通知所有视图,而不是 Model。但是即使它刚刚被修改,任何视图都不会向 Presenter 发送更改通知。
主持人将如何通知谁,谁不通知?模型如何知道它是否需要发送更改通知?毕竟,它只是被修改,但它不一定知道是谁。
一种可能性是让每个人(模型、视图和演示者)自由地发送更改通知,但在通知中存储对最初触发更改的对象的引用(从而将通知封装在事件对象中)。然后,每个对象仅在他不是更改的原始触发器时才发送通知。但是有没有更简单、更清洁的方法呢?
c# - 如何在 C# Winforms 中正确实现具有被动功能的模型视图演示器?
我现在正在研究设计模式,我对这个模型视图演示器相当陌生,虽然我已经在 asp.net mvc 方面有经验,但我正在尝试在 winforms 中实现 mvp。
文本框中的字符串将使用基于组合框的算法进行排序。现在,当我单击按钮时,它会引发空引用异常
这是用户界面:
这是我的课程和代码:
我没有包含模型的代码和包含排序函数的类以保持这篇文章的简短。我遇到的问题是,单击按钮时会引发空引用异常错误,这是我已经坚持了几个小时的问题。
先生/女士,您的回答会很有帮助。谢谢++
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 修改。
我的方法有更好的选择吗?还是我所做的已经足够好?我也希望我目前的方法有任何改进。
java - 使用 Mockito 对具有被动视图的演示者进行单元测试
问题
“管理”被动视图的演示者订阅该视图中发生的事件(例如按钮单击),并且不直接将处理这些事件的方法公开为公共接口。我不喜欢将这些方法公开仅用于单元测试的想法,因为它闻起来像是暴露了内部实现细节。因此,调用该事件处理代码变得非常重要。
我的解决方案
视图模拟必须“拦截”事件订阅,然后使用相应的拦截侦听器来调用事件处理代码。我的实现包括一个实用程序类,它实现了 Mockito API 的 Answer 接口
事件订阅的拦截方式如下
创建 SUT 实例后...
...我获得了听众
在“ Act ”部分我调用了监听器的事件处理方法
问题
我对 Java 中的单元测试很陌生,所以我想知道是否有更优雅的方式来测试演示者代码。当前的“排列”部分相当臃肿,似乎在可读性方面并不出色。
编辑: 应乔纳森的要求添加简化的 SUT 代码。它说明演示者没有任何公共方法(构造函数除外),并订阅视图事件。
c# - Passive View - 查看具体逻辑
假设我想实现被动视图设计模式。我有一个包含列表框的视图(将来我可能会与列表视图或其他东西交换)。现在,使用被动视图应该使视图尽可能地愚蠢。可以说我想更改选择。我将把这个逻辑放在演示器中,因此我在视图界面中添加一个属性来获取和设置视图列表框的 SelectedIndex 属性。但是,如果我将来想用列表视图交换列表框,我就有麻烦了,因为列表视图没有 SelectedIndex 属性。然后我是否在视图中实现一些逻辑(基本上使它不那么愚蠢),例如:
或者我是否在视图和演示者之间放置了某种适配器。什么是最合乎逻辑的方法?
c# - MVP:被动视图(使用 EF)和层
我正在使用 MVP 创建应用程序:被动视图和 EF(模型优先)。据了解,我有一个演示者直接从通过 EF 创建的 DataContext 获取数据。它看起来像这样:
所以presenter得到一个所有订单的列表,创建一个订单视图模型列表(结合来自不同表的数据,即上面的地址),然后将视图模型列表发送到视图。
反过来,从视图中检索数据以编辑或添加到数据库时,情况几乎相同:
1) EF(通过 EF、DataContext 等创建的实体)可以被视为 DAL 吗?它应该在自己的项目中吗?
2)我猜演示者不应该像那样访问 DataContext ,而是访问两者之间的另一层,对吧?那是服务层,业务层还是两者兼而有之?
3)我所说的视图模型实际上是视图模型还是其他东西?我只是想让我的术语正确。
编辑:
4) 我阅读了一些关于向 EF 生成的实体添加业务逻辑的建议,但这对我来说听起来不太正确。我应该在 EF 之上的单独业务层中创建业务对象吗?这意味着我将拥有 Order(由 EF 生成)、OrderBO(业务对象)和 OrderViewModel(要显示的订单)。我将不得不做更多的映射,因为我会添加另一个图层,但它会使演示者更轻。
提前致谢!
c# - 简单 WinForms 应用程序中的 Passive View MVP 问题
想象一个带有客户列表的简单应用程序:
当用户单击特定客户时,将显示客户数据编辑器窗口:
EditorPresenter
必须知道用户选择的客户,但视图不知道客户模型和正确初始化EditorPresenter
.
我怎么解决这个问题?
java - JCheckbox 只通过控制器改变他的状态
普通 JCheckbox 直接对用户输入做出反应并设置或取消设置刻度。在此之后调用 MouseListener。我想要实现的是 JCheckbox 的状态只能由控制器更改。什么是体面的方式来实现这一目标?
我尝试添加一个鼠标侦听器,它会立即再次添加/删除刻度,但这会导致闪烁。
我发现的唯一方法是覆盖 processMouseEvent 方法,但这真的很糟糕......
编辑(我当前的版本):这现在可以工作了。之前错过了调整模型。
c# - 如何使用 MVP 和被动视图 Form.ShowDialog()?
概括
我正在 Windows 窗体应用程序中试验 MVP 模式。
我想让我的 Presenters 和 Views 平台不可知,所以如果我想将我的应用程序移植到另一个平台,比如 Web 或移动设备,我只需要使用平台相关的 GUI 实现视图,我的 Presenters 仍然可以独立于平台。
现在我想知道,如何使用 MVP 和被动视图来 ShowDialog()?
到目前为止,据我所知,被动视图不应该知道/关心任何演示者。他们甚至不知道它的存在。因此,根据我的说法,这个问题的答案中提出的解决方案不合适: Refactoring Form.ShowDialog() code to MVP
一些代码示例有助于理解:
ApplicationView
ApplicationPresenter
- 这就是我挣扎的地方。ApplicationPresenter 就像 Universer 中的主人,可能通过 和 知道用户身份
IAuthenticationView
验证IAuthenticationPresenter
。
IAuthenticationView
IDialogView
IView
IAuthenticationPresenter
IPresenter<V>
c++ - 使用 FLTK 的 MVP 被动视图方法
我有一个非常基本的问题,尝试将 FLTK 与 MVP Passive View 一起使用,如所述处所述。我设法做到了,但我这样做的方式感觉不对。
我有一个Fl_Window
, 包含一些小部件和一个Fl_Gl_Window
用于 OpenGL 的功能。如您所知,您可以将小部件和东西添加到Fl_Window
betweenbegin()
和end()
. 当你在这些调用之间直接添加它时,似乎你必须实例化所有东西,所以我得到了类似的东西:(
请查看代码旁边注释中的小“故事”,因为它解释了我在做什么和我想知道在这种情况下这是否可以,或者也许有人可以为我指出更好的解决方案,因为它真的感觉不对。)
主文件
查看.h
查看.cpp
GlWindow.h
演示者.h
IView.h 看起来与 IPresenter.h 相同。
因为我想做MVP
,两个窗口都是视图(一个View
包含另一个)。每个View
需要与Presenter
和 通信,如序列图中所示Fowler
,View
需要持有对 的引用Presenter
反之亦然。所以我在接口头中使用了前向声明。
如前所述,我想知道是否有更好的方法来做到这一点。Fl_Gl_Window
也许在此时无需实例化它就可以以某种方式添加。或者也许我的MVP Passive View
方法不正确。
我希望我的解释是可以理解的。在此先感谢您的帮助!