这与我发布的一个早期问题密切相关,尽管带有不同的图像编辑库(Camanjs而不是Pixastic),而代码进行了一些重构。
我正在尝试编写一个函数changify
,该功能将HTML5映像画布还原为原始状态,然后对其进行许多预设更改。此代码,从称为camanCache
的列表中加载右画布元素imageClipName
,可工作:
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
camanCache[imageClipName]
.brightness(10)
.contrast(10)
.noise(10)
.render()
console.log(camanCache[imageClipName])
,但我想要的是从另一个称为imageValues
的列表中找到保存的预设更改,并动态创建图像函数的字符串从该列表的键值对更改。这是我尝试做的事情,失败了:
imageClipName = "image_1"
imageValues = {image_1:{brightness: 10, contrast: 10, noise: 10}, image_2:{...}...}
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
camanCache[imageClipName]
for o in imageValues when o.id == imageClipName
for key, val of o
.#{key}(val)
.render()
这给了我changify
功能(Unexpected 'INDENT'
)的第三行的Coffeescript语法错误,但我怀疑.#{key}(val)
将多个功能附加到camanCache[imageClipName]
上不起作用。如何在Coffeescript中动态字符串函数?
我想您正在尝试这样做:
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
clip = camanCache[imageClipName]
for id, methods of imageValues when id == imageClipName
for name, arg of methods
clip = clip[name](arg)
clip.render()
请注意,由于您在对象上迭代,for ... in
用于COFCEESCRIPT中的for ... of
的开关。
所以给定:
{brightness: 10, contrast: 10, noise: 10}
在methods
中,此循环:
clip = camanCache[imageClipName]
for name, arg of methods
clip = clip[name](arg)
clip.render()
具有与:
相同的效果camanCache[imageClipName].brightness(10).contrast(10).noise(10).render()
未定义在对象o
上迭代时key, val
对的顺序,因此无法保证brightness
,contrast
和noise
调用的顺序。如果您需要特定顺序,则必须将数组用于methods
:
imageValues = {image_1: [['brightness', 10], ['contrast', 10], ['noise', 10]], ... }
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
clip = camanCache[imageClipName]
for id, methods of imageValues when id == imageClipName
for method in methods
clip = clip[method[0]](method[1])
clip.render()
或更好:
imageValues = {image_1: [ {name: 'brightness', arg: 10}, {name: 'contrast', arg: 10}, {name: 'noise', arg: 10}], ... }
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
clip = camanCache[imageClipName]
for id, methods of imageValues when id == imageClipName
for method in methods
clip = clip[method.name](method.arg)
clip.render()