可以将对象传递给组件
我不知道从架构的角度来看是否可以将主题传递到组件中。我真正想要的是使组件公开可观察到的东西。但是,我想控制此可观察到的流的来源,因此这就是为什么Im询问是否可以通过该组件可以引发“事件”的主题。
好的,让我们详细说明一下。
说,我们正在设计一个组件,该组件需要用户输入,限制击键并显示结果列表。实际搜索是在另一个服务组件上进行的。
我想像这样设计SearchWidget创建函数:
//notice how I just avoided the word \"constructor\". However, conside this code as
//language agnostic. Could be RxJs or Rx .NET. It\'s Rx(ish)!
function SearchWidget(userInputStream, resultStream){
// do some funky Rx hotness!
}
更高级别的组件(例如控制器/介体)实际上将连接流。
显然,resultStream需要inputStream来完成工作。
在上面的示例中,从SearchWidget的角度来看,resultStream可以简单地观察到,并可以在其上侦听结果列表。但是,它将在更高级别的组件中作为“主题”实现。
相比之下,从SearchWidget的角度来看,userInputStream将是一个主题,但是它将在更高的组件级别上被实例化,因为我们需要预先获取它才能使resultStream挂接起来。但是,从更高级别的组件的角度来看,它是一个简单的观察对象。
高阶代码可能看起来像这样:
//This code lives in a higher order component (say a controller/mediator)
var resultStream = new Rx.Subject();
var userInputStream = new Rx.Subject();
userInputStream
.Throttle(500)
.DistinctUntilChanged()
.Select(service.search) //service comes from somewhere.
.Switch()
.Subscribe(resultStream.OnNext,
resultStream.OnError,
resultStream.OnCompleted);
var searchWidget = new SearchWidget(userInputStream, resultStream.AsObservable());
在上面的实现中,在初始化SearchWidget之前,我使用了userInputStream。当然我也可以这样实现:
//implementation of the search widget
function SearchWidget(resultStream){
var userInputStream = new Rx.Subject();
// provide something like getUserInputStream()
// that will return unserInputStream.AsObservable()
// do some funky Rx hotness!
}
//This code lives in a higher order component (say a controller/mediator)
var resultStream = new Rx.Subject();
var searchWidget = new SearchWidget(resultStream);
//we need to initialize the searchWidget in advance to get the userInputStream
searchWidget
.getUserInputStream()
.Throttle(500)
.DistinctUntilChanged()
.Select(service.search) //service comes from somewhere.
.Switch()
.Subscribe(resultStream.OnNext,
resultStream.OnError,
resultStream.OnCompleted);
因此,从封装的角度来看,第二种实现可能看起来更健壮。但是,传递主题可以提供更大的灵活性。
由于使用事件流的概念非常现代,因此我在设计具有事件流的应用程序时努力寻找更大的最佳实践。
没有找到相关结果
已邀请:
2 个回复
物崎巩
亨尖玛次酥
它更加明确,您将能够通过名称明确的方法以一种更加清晰的方式表示SearchWidget上的结果。 如果确实要通过Rx处理这些响应的内部,那么在内部实例化主体并处理方法调用的响应就没有错。如: