通过在coffeescript中的对象循环循环来调用动态字符串函数



这与我发布的一个早期问题密切相关,尽管带有不同的图像编辑库(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对的顺序,因此无法保证brightnesscontrastnoise调用的顺序。如果您需要特定顺序,则必须将数组用于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()

最新更新