问题标签 [observers]

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 投票
6 回答
3188 浏览

ruby-on-rails - 在观察者中访问会话的好主意吗?

我想在我的 Ruby on Rails 应用程序中记录用户的操作。

到目前为止,我有一个模型观察器,它在更新和创建后将日志插入数据库。为了存储哪个用户执行了记录的操作,我需要访问会话,但这是有问题的。

首先,它打破了MVC模型。其次,技术范围从 hackish 到古怪,甚至可能将实现与 Mongrel 服务器捆绑在一起。

正确的做法是什么?

0 投票
2 回答
2758 浏览

design-patterns - 如果主题是一个巨大的容器,你如何有效地实现观察者模式?

我们都知道观察者模式:您有一个主体能够通知和更新其状态变化的观察者列表。现在假设您要观察的对象是一个容器,您要观察容器本身,即元素的添加和删除,以及包含的元素,即容器元素的状态更新。

当您在容器中存储大量对象时,您将如何实现更新机制以便在元素插入和删除方面快速?尤其,

  • 你会在观察者的本地副本中使用相同类型的容器吗?
  • 观察者应该使用容器的明智选择吗?(例如,即使您正在观察链表,总是使用平衡树会更快吗?)
  • 你如何快速将一个迭代器翻译成被观察的容器到一个迭代器到观察者的容器?(对于数组来说微不足道,对于链表来说很难?)

例如,如果您的容器是一个链表,那么您可以在恒定时间内插入元素。如果 m 个观察者必须遍历包含 n 个元素的列表,则更新需要 O(n * m) 预期时间。

如果你的容器是一个数组,那么改变一个元素需要恒定的时间,如果你传递元素的索引,更新 m 个观察者需要 O(m),如果观察者必须遍历数组,则需要 O(n * m)。

如果有帮助,请考虑以下示例:

示例 1. 你正在编写一个操作系统。您要观察的主题是文件系统及其文件。您的视图是文件浏览器、索引器和其他应用程序。您想在添加、删除或修改文件时更新观察者。

示例 2。您正在编写一个地址簿应用程序,它应该能够处理纽约这样大小的城市。您要观察的主题是您的记录容器(一个人及其地址、电话号码、电子邮件......)。您的观察者是多个视图,当您添加、删除或修改记录时,它们应该会自动更新。(人们可以想象一个视图,其中包含居住在 53 街的人的列表,另一个在地图上为姓氏为 Doe 的每个人绘制点)。

您如何处理完整的目录子树被删除或“53rd St”重命名为“Dijkstra St”的情况?

0 投票
1 回答
817 浏览

ruby-on-rails - Rails 用户模型 has_many 活动(观察者)但也应该被观察

我遇到了ActiveRecord::Observer记录各种站点的现有模型ActivitiesUser问题。一切都很好,直到我尝试使用与其他模型相同的模型来上课observe。考虑一下:UserActivityobserve

以上工作正常。查询User.activities将返回Comment Activities. 一旦我添加:userobserve方法中并将模型ActivityObserver更改为,将只返回与该实例相关的活动而不是任何has_many :activitiesUserhas_many :activities, :as => :itemUser.activitiesUserComments

为什么是这样?我能做些什么来让它按预期工作?

0 投票
3 回答
414 浏览

java - 如何在 Javascript 中使用 java.util.Observable?

我正在构建一个 Drupal 模块,它将“FileCatalyst”Java FTP 小程序与标准 Drupal 表单集成在一起。我正在实现一个挂钩以在文件传输完成时提交表单。目前我正在使用 setTimeout() 调用轮询小程序,但如果状态更改发生得太快,此方法可能会错过。

然而,FileCatalyst 对象继承自 java.util.Observable——因此显然可以为 applet 注册一个观察者并获得状态变化的通知。我想知道如何实现这一点。

我可以使用 Javascript 中的 document.FileCatalyst.addObserver(obj) 函数将这些状态更改发送到 Javascript 对象吗?我将什么传递给 addObserver?如何构建观察者?观察者需要实现哪些方法才能接收状态更改通知?

0 投票
3 回答
2891 浏览

ruby-on-rails - 从 Rails 应用程序中监视数据库表的外部更改

我在我的 Rails 应用程序中集成了一些非 Rails 模型表。一切都很顺利,我设置模型的方式是:

这样我就可以将Change模型用于所有现有记录find等。

现在我想在将记录添加到表时运行某种通知。由于模型永远不会通过创建Change.new,因此Change.save使用ActiveRecord::Observer不是一种选择。

每当添加新记录时,有什么方法可以让我的一些 Rails 代码被执行?我看了看,delayed_job但无法完全理解,如何设置。我想它是围绕一个 cron-job 发展的,它选择自上次运行作业以来创建的所有行,然后为每一行调用相应的 Rails 代码。

更新目前正在查看 Javan 的When,看起来它可以解决“从 cron 部分运行 rails 代码”。

0 投票
1 回答
324 浏览

ruby - 如何在 datamapper 观察者中访问旧状态值?

我正在使用 dm-observer 来观察我的 dm 模型,我需要根据模型中的状态变化执行一些操作。我发现@state 用于存储更新的状态值,但我无法弄清楚如何访问旧的状态值。在下面的示例中,我使用了“old_state”,但显然这不起作用。

0 投票
5 回答
2373 浏览

c++ - 如何将数据传递给“通用”观察者?作为参数还是作为单个结构?

我正忙于向旧版 C++ 应用程序添加通用观察者机制(使用 Visual Studio 2010,但不使用 .Net,因此 .Net 委托是不可能的)。

在设计中,我想尽可能地将特定于应用程序的部分与通用观察者机制分开。

实现观察者的最合乎逻辑的方式似乎是这样的:

对于每种类型的观察者(IDoThisObserver、IDoThatObserver、...),方法(handleDoThis、handleDoThat)的参数都是不同的。

以通用方式存储观察者的内容,如下所示:

调用观察者不能一概而论,因为每种观察者类型的参数都不同。

另一种方法是将所有参数“打包”到一个参数中,如下所示:

然后定义一个更通用的观察者,像这样:

然后这些观察者的集合将变成这样:

现在,更多的逻辑可以集中添加到这个 ObserverContainer 中,包括调用所有的观察者。调用的“发起者”只需要创建并填写通知结构。

想要从多种观察者继承的类,需要这样做:

这些方法中的哪一种(具有多个显式参数或具有一个结构参数的观察者)看起来最好?这两种方法有什么优点或缺点吗?

编辑:我进一步研究了替代方法,插槽/信号方法似乎是另一个不错的选择。我应该知道插槽/信号中有什么重要的缺点吗?

0 投票
4 回答
1067 浏览

macos - Mac OS X - 监控应用程序启动?

我想为 Mac OS X 编写一个简单的菜单栏应用程序。用户只想在 Safari 打开时使用该应用程序。为了避免不必要地弄乱菜单栏,我想根据 Safari 是否打开来隐藏和显示菜单栏图标。

是否有一些通知可以让我的应用注册?我能想象的唯一解决方法是轮询正在运行的进程并查看是否启动了 Safari,但这似乎不是解决我的问题的一种优雅方式......

0 投票
1 回答
1130 浏览

php - Magento:如何从捆绑产品中检索选项信息?

我有一个捆绑产品,其中包含 3 个虚拟产品作为选项。

当将商品添加到购物车时,我有一个观察者正在监听一个事件,我很难弄清楚如何获取我在查看产品时选择的选项信息:观察者的开始看起来像这个:

对 $product->getSku() 的调用返回捆绑产品的 sku。我希望能够获取我选择的选项的 sku,但无法弄清楚如何做到这一点。

谢谢!

0 投票
2 回答
789 浏览

design-patterns - 这叫做“循环引用”吗?

有了观察者模式,我们都知道,基于它的类图,SUBJECT 使用了对 OBSERVER 的引用。同时,OBSERVER 有一个对 SUBJECT 的引用,以便注册或删除自己。

这是“循环引用”吗?