0

我希望 Marko.js 组件发出一个事件和一个值,然后我希望包含的组件侦听该事件并访问该值。

我有一个简单的按钮组件,如下所示:

class {
    doSomething() {
        this.emit('buttonClicked', {someValue:'10'});
    }
}

<button.example-button on-click('doSomething')>Click me!</button>

包含组件然后看起来像这样......

class {
	onButtonClicked(data){
		console.log("I heard event:" + data.someValue);
	}
}

<div class="button-manager">
  <my-button on-buttonClicked('onButtonClicked') />
</div>

这有效并使用该值正确记录事件。但是我有点困惑,因为我希望容器中的语法引用事件侦听器中传递的参数......就像这样......

<div class="button-manager">
  <my-button on-buttonClicked('onButtonClicked', data) />
</div>

但是,这会追踪出一个空对象。如果我将一个字符串作为参数,该字符串被记录并覆盖从发射器传递的原始数据参数。

这是预期的行为吗?

4

1 回答 1

2

鉴于以下内容并继续您的示例:

class {
    onButtonClicked(foo, bar, eventArg){
        console.log('foo:', foo);
        console.log('bar:', bar);
        console.log('eventArg:', eventArg);
    }
}

$ var foo = 'foo';
$ var bar = 'bar';

<div class="button-manager">
    <my-button on-buttonClicked('onButtonClicked', foo, bar) />
</div>

buttonClicked发出以下输出:

foo: foo
bar: bar
eventArg: { someValue: 10 }

在事件处理程序的方法名称之后传递的其他参数将在参数的开头传递给事件处理程序方法。请参阅: http: //markojs.com/docs/components/#codeon-eventmethodname-argscode

旁注:这是为了反映Function.prototype.bind

除非您想将其他数据传递给事件处理程序方法(this.emit()调用时未提供的数据),否则无需绑定任何其他参数。

希望这能回答你的问题。

于 2017-03-29T17:27:39.420 回答