如何在QML JavaScript中存储函数并在以后调用它

3

以下是代码的一部分:

Repeater{
    model: [["Text A", function(){console.log("hello A")}],
            ["Text B", function(){console.log("hello B")}],
            ["Text C", function(){console.log("hello C")}],
            ["Text D", function(){console.log("hello D")}]]
    delegate: Button{
        text: modelData[0]
        onClicked: modelData[1](); // Type Error
    }
}

我希望为每个按钮提供不同的行为。我认为它应该与原生JavaScript相同。

var func = function(){
  //...
}
func();

如何在QML JavaScript中实现此功能?

顺便提一下,我的解决方案是:

Repeater{
    model: ["Text A",
            "Text B",
            "Text C",
            "Text D"]
    delegate: Button{
        text: modelData
        onClicked: {
           switch(index)
           {
              cast 0:
                console.log("hello A")
                break;
              cast 1:
                console.log("hello B")
                break;
              cast 2:
                console.log("hello C")
                break;
              cast 3:
                console.log("hello D")
                break;
           }
        }
    }
}

你能更好地解释一下吗? - eyllanesc
@eyllanesc 我想在组件(Button)创建的时候,将lambda函数的函数指针存储为变量,并将其存储到数组(Repeator模型)中。然后,如果单击Button,则调用存储的函数指针。 - JustWe
1个回答

2

这对我来说看起来像是一个 bug,它无法通过模型接口到达函数。或许是设计上的限制。就函数而言,它是未定义的(undefined)。

您可以采用以下方式解决:

  property var mod :
   [["Text A", function(){console.log("hello A")}],
    ["Text B", function(){console.log("hello B")}],
    ["Text C", function(){console.log("hello C")}],
    ["Text D", function(){console.log("hello D")}]]

  Column {
    Repeater {
      id: rep
      model: mod
      delegate: Button {
        text: modelData[0]
        onClicked: mod[index][1]()
      }
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接