2015-11-14 60 views
1

假设我有两个自定义元素:a和b。 a包含另一个可以单击的元素,我想在发生这种情况时触发自定义事件。那个自定义事件应该被元素b捕获。riot.js:收听其他元素的事件

我可以在元素a中使用this.trigger,但是元素b中的this.on不会捕获事件(这似乎是逻辑的,因为它没有在b上触发)。

因此:我可以检索元素b中的元素a在元素b中执行类似“elementA.on()”的操作吗?

基本上,我想要RiotControl等功能,但没有存储数据,因为我只是想在我的用例中触发一个模式,而不是存储任何东西。

我可能会回到jQuery并触发并监听文档上的事件,但这真的是一个好方法吗?

+0

你能不能创建在一个包装A和B父组件的事件处理程序?这样的结果可以传递给两个元素。 – azium

+0

我宁愿不改变我的html结构,因为事件可以被触发/接收,因为我认为它现在是好的方式,但是谢谢你的建议。 – lupor

+0

你是否需要修改html来做到这一点?你应该能够创建一个不添加任何元素的包装器组件。 – azium

回答

2

您可以创建一个共享的可观察到的如:

var eventBus = riot.observable(); 

当你安装你的元素,你可以把它作为一个选项:

riot.mount('elementa', { eventBus: eventBus }) 
riot.mount('elementb', { eventBus: eventBus }) 

然后,他们可以在听录音的触发同一观察到:

this.opts.eventBus.trigger('openModal', ...maybeSomeOptions); 
this.opts.eventBus.on('openModal', function(...maybeSomeOptions) {}); 

免责声明:riotjs是新的我

+0

谢谢,似乎是一个很好的解决方法。但我必须更改我的坐骑以手动包含每个标记(以前我可以使用'*')以使其起作用。 – lupor

0

我解决这个问题的方法是使用mixin自动将相同的Observable包含到多个标记中。

// mixins.js 
let ObservableMixin = { 
    observable: riot.observable() 
}; 

然后,在任何.tag文件中,我希望共享观察点能够存活,我只需要调用。

// Any .tag file 
this.mixin(ObservableMixin); 
... 
this.observable.trigger('eventName', { optional: options }); 

有关混入更多信息,请查看:Riot Mixins

+0

“全球mixin”也可能对某些人有用:http://riotjs.com/guide/#mixins(向下滚动“Global mixins”部分) – JoeRocc

+0

是的,这个mixin其实是全球性的,我只是根据它在这个例子中试图解决的问题命名它。它可以被称为'globalMixin'或任何你喜欢的。 –

+0

@lupor你有没有尝试以上? –