我试图在Angular中实现类似委托模式的东西.当用户点击a时nav-item,我想调用一个函数然后发出一个事件,而该事件又由一些其他组件监听事件来处理.
这是场景:我有一个Navigation组件:
import {Component, Output, EventEmitter} from 'angular2/core';
@Component({
// other properties left out for brevity
events : ['navchange'],
template:`
<div class="nav-item" (click)="selectedNavItem(1)"></div>
`
})
export class Navigation {
@Output() navchange: EventEmitter<number> = new EventEmitter();
selectedNavItem(item: number) {
console.log('selected nav item ' + item);
this.navchange.emit(item)
}
}
Run Code Online (Sandbox Code Playgroud)
这是观察组件:
export class ObservingComponent {
// How do I observe the event ?
// <----------Observe/Register Event ?-------->
public selectedNavItem(item: number) {
console.log('item index changed!');
}
}
Run Code Online (Sandbox Code Playgroud)
关键问题是,如何让观察组件观察相关事件?
event-delegation observable observer-pattern eventemitter angular
一位采访者问我:
什么是Observer和Observable我们何时应该使用它们?
我不知道这些术语的,所以,当我回到家,开始对谷歌搜索Observer和Observable,我发现来自不同资源的一些要点:
1)
Observable是一个类,Observer是一个接口.2)
Observable该类维护一个Observers 列表.3)当一个
Observable对象被更新时,它会调用update()每个Observers 的方法来通知它,它被改变了.
我找到了这个例子:
import java.util.Observable;
import java.util.Observer;
class MessageBoard extends Observable
{
public void changeMessage(String message)
{
setChanged();
notifyObservers(message);
}
}
class Student implements Observer
{
@Override
public void update(Observable o, Object arg)
{
System.out.println("Message board changed: " + arg);
}
}
public class MessageBoardTest
{
public static void main(String[] args)
{ …Run Code Online (Sandbox Code Playgroud) 我在Stack Overflow上搜索了一下,没有找到任何好的答案.
我所相信的是,数据绑定是一个通用术语,有不同的实现方式,如观察者模式或发布/子模式.使用Observer模式,Observable更新其观察者.使用Pub/Sub,0-many发布者可以发布某些类的消息,0-many订阅者可以订阅某些类的消息.
是否有其他实施"数据绑定"的模式?
data-binding model-view-controller design-patterns publish-subscribe observer-pattern
我正在我的模型观察器中设置一个after_save回调,只有当模型的已发布属性从false更改为true 时才发送通知.既然方法改变了?只有在保存模型之前才有用,我目前(并且未成功)尝试这样做的方式如下:
def before_save(blog)
@og_published = blog.published?
end
def after_save(blog)
if @og_published == false and blog.published? == true
Notification.send(...)
end
end
Run Code Online (Sandbox Code Playgroud)
有没有人对处理这个问题的最佳方法有任何建议,最好使用模型观察者回调(以免污染我的控制器代码)?
model ruby-on-rails callback observer-pattern ruby-on-rails-4
我最近开始深入研究C#,但我不能通过我的生活弄清楚委托在语言中实现观察者/可观察模式时的工作方式.
有人能给我一个超级简单的例子说明它是如何完成的吗?我用谷歌搜索了这个,但我发现的所有例子都是特定于问题或过于"臃肿".
在我看来,GOF中描述的Observer设计模式与Listeners在各种工具包中找到的实际上是相同的.概念之间是否存在差异,或者听众和观察者是否真的相同.
(我不是在寻找任何特定的计算机语言实现,我只是想从设计的角度来理解差异(如果有的话).是的,我知道有关SOF的类似问题有几个答案,但它们已根深蒂固关于特定语言的具体问题 - 我正在寻找设计答案,而不是语言答案.)
Java 9问世,Observer已被弃用.这是为什么?这是否意味着我们不应该再实施观察者模式了?
知道什么是更好的选择会很好吗?
我一直在阅读四人帮,以解决我的一些问题,并遇到了Mediator模式.
我之前在项目中使用了Observer来制作一些GUI应用程序.我有点困惑,因为我发现两者之间没有太大区别.我浏览找到差异,但找不到任何适合我的查询的答案.
有人可以帮助我区分两者,并用一些明确划分两者的好例子吗?
将听众保持为WeakReferences的利弊是什么.
当然,最大的'专业'是:
将侦听器添加为WeakReference意味着侦听器不需要打扰"删除"自身.
更新
对于那些担心只有对象引用的侦听器,为什么有2个方法,addListener()和addWeakRefListener()?
那些不关心去除的人可以使用后者.
我有一个观察者,我注册了一个after_commit回调.如何判断它是在创建或更新后被触发的?我可以通过询问来判断某个项目已被销毁item.destroyed?但是#new_record?因为该项目已保存而无法正常工作.
我打算通过添加after_create/ after_update并执行类似于@action = :create内部的操作并检查@actionat 来解决它after_commit,但似乎观察者实例是单例,我可能只是在它到达之前覆盖一个值after_commit.所以我以一种更丑陋的方式解决了这个问题,根据after_create/update上的item.id将动作存储在地图中,并在after_commit上检查它的值.真的很难看
还有其他方法吗?
正如@tardate所说,transaction_include_action?虽然它是一种私有方法,但它是一个很好的指示,并且在观察者中它应该被访问#send.
class ProductScoreObserver < ActiveRecord::Observer
observe :product
def after_commit(product)
if product.send(:transaction_include_action?, :destroy)
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,该:on选项在观察者中不起作用.
只要确保你测试你的观察者的地狱(test_after_commit如果你使用use_transactional_fixtures 寻找宝石)所以当你升级到新的Rails版本时,你会知道它是否仍然有效.
(测试3.2.9)
我现在使用ActiveSupport :: Concern代替Observers并after_commit :blah, on: :create在那里工作.
observer-pattern ×10
java ×3
observable ×2
angular ×1
c# ×1
callback ×1
data-binding ×1
delegates ×1
deprecated ×1
eventemitter ×1
events ×1
java-8 ×1
java-9 ×1
listener ×1
mediator ×1
model ×1
observers ×1
oop ×1
transactions ×1