高级qooxdoo控制器选择绑定?

时间:2016-10-22 16:19:48

标签: qooxdoo

我只需要至少选择一个项目时启用一个按钮,另外我想绑定所选项目的数量。

在应用绑定时使用转换器函数我得到了以下解决方案(run in qooxdoo Playground):

// Multi-selection with <Ctrl> enabled. Click the button to clear the selection.

root = this.getRoot();
root.setLayout(new qx.ui.layout.VBox());

var model = new qx.data.Array(['one', 'two', 'three', 'four', 'five']);

var list = new qx.ui.form.List().set({selectionMode: 'multi'});
root.add(list);

var button = new qx.ui.form.Button();
button.addListener('execute', list.resetSelection, list)
root.add(button);

/**** Bindings ****/

var controller = new qx.data.controller.List(model, list);

// Enable button when there is at least one list element selected
controller.bind('selection[0]', button, 'enabled', {
   converter: function (data)
   {
      return (data) ? true : false;
   }
});

// Label button with amount of selected list items
controller.bind('selection', button, 'label', {
   converter: function (data)
   {
     return data.length.toString();
   }
});

它有效,但是

是否有更好的解决方案,理想情况下没有转换器功能?

我搜索了“isSelected”或“selection.length”等属性,但无济于事。我想了解绑定系统,并认为我错过了一些东西......

通过事件启用/禁用按钮,没有绑定,更不优雅,它需要最初禁用按钮:

controller.getSelection().addListener('change', function ()
{
   button.setEnabled(controller.getSelection().getLength() > 0)
}, this)
button.setEnabled(false)

1 个答案:

答案 0 :(得分:1)

即使你有一个 isSomethingSelected 标志,你也需要一些绑定。

选择是一个 qx.data.Array ,因此您可以通过监听长度更改来简化您的代码 - 或者通过使用数字绑定到布尔转换器,或使用更改侦听器:

controller.getSelection().addListener("changeLength", function(ev) {
  var length = ev.getData();
  button.set({
    enabled : length > 0,
    label : length.toString()
});

如果您想要按钮中所选项目的数量,后者是有意义的。正如您已经说过的那样,在这种情况下,您最初需要禁用该按钮。