Riot+CoffeeScriptで転んだ
10850 ワード
こんなのを
my-tag.tag(type=none)
<my-tag>
<input value={value}>
<button each={list} onclick={click}>{name}</button>
<script>
this.value = 'initial'
this.list = [
{name: 'btn-1', value: 'update 1'},
{name: 'btn-2', value: 'update 2'}
];
click(e) {
this.value = e.item.value
}
</script>
</my-tag>
こうしたら
my-tag.tag(type=coffee)
<my-tag>
<input value={value}>
<button each={list} onclick={click}>{name}</button>
<script type="coffee">
@value = 'initial'
@list = [
{name: 'btn-1', value: 'update 1'}
{name: 'btn-2', value: 'update 2'}
]
@click = (e) ->
@value = e.item.value
</script>
</my-tag>
value
が変わらなくなってしまった
それぞれコンパイル後のファイル(以下比較のため整形済み)を見比べてみたら
my-tag.js(type=none)
riot.tag(
'my-tag',
'<input value="{value}"><button each="{list}" onclick="{click}">{name}</button>',
function(opts) {
this.value = 'initial'
this.list = [
{name: 'btn-1', value: 'update 1'},
{name: 'btn-2', value: 'update 2'}
];
this.click = function(e) {
this.value = e.item.value
}.bind(this);
}
);
my-tag.js(type=coffee)
riot.tag(
'my-tag',
'<input value="{value}"><button each="{list}" onclick="{click}">{name}</button>',
function(opts) {
this.value = 'initial';
this.list = [
{name: 'btn-1', value: 'update 1'},
{name: 'btn-2', value: 'update 2'}
];
this.click = function(e) {
return this.value = e.item.value;
};
}
);
改行やスペースを除くと相違点は.bind(this)
(とreturn
)のみだった
ので
my-tag.tag(type=coffee)
# 〜略〜
@click = ((e) ->
@value = e.item.value
).bind @
# 〜略〜
</my-tag>
のように修正したところ正常に動くようになった
each
の中でなければbind
の必要は無い
が、純riot
の場合と揃えるため毎回bind
しといたほうがいい気がする
そのうちコンパイラ読もう
Author And Source
この問題について(Riot+CoffeeScriptで転んだ), 我々は、より多くの情報をここで見つけました https://qiita.com/0x259e/items/82e9a8fedc49137b0d28著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .