2017-02-14 3 views
1

Я создал пользовательский ListItem, в котором есть некоторые дочерние элементы. Один из них - виджет Combobox.Связать свойство с пользовательским списком Элемент

Я хочу установить модель контроллером, для этого я использовал qx.data.controller.List.

С bindItem и controller.bindProperty("", "model", null, item, index); Я привязываю свою модель к списку.

Моя проблема в том, что у меня есть одно свойство в моей модели (text), которое должно быть привязано к значению Value Combobox.

Я пробовал controller.bindProperty("text", "value", null, item.getChildControl("combobox"), index);, но я не получил его для работы.

Что я делаю неправильно?

+0

Пожалуйста, вы можете создать пример детской площадки, которая демонстрирует вашу проблему с помощью http://www.qooxdoo.org/current /детская площадка/ ? Это позволяет другим людям быстро увидеть точную проблему и продемонстрировать исправления, характерные для вашего кода. – johnspackman

+0

Я попытался построить один, но я не получил его работу. Надеюсь, вы все равно увидите, чего я хочу достичь. tinyurl.com/jjybff7 –

+0

Я немного изменил его. Я хочу использовать свои собственные свойства, а не только модельные, поэтому я могу слушать изменения событий. Я также хочу прослушать событие changeSelection контроллера. Это работает, но я данные в слушателе всегда 'null'. Вот обновленная игровая площадка: tinyurl.com/zynyyhq –

ответ

1

Вот окончательный ответ на ваш вопрос, в том числе способность удалять элементы:

qx.Class.define("CustomListItem", { 
    extend: qx.ui.core.Widget, 
    include: [qx.ui.form.MModelProperty], 

    properties: { 
     isDistribution: { 
      init: true, 
      check: "Boolean", 
      event: "distributionChange" 
     }, 
     isFilter: { 
      init: false, 
      check: "Boolean", 
      event: "symbolEvent" 
     }, 
     isColumn: { 
      init: false, 
      check: "Boolean", 
      event: "symbolEvent" 
     }, 
     isRow: { 
      init: false, 
      check: "Boolean", 
      event: "changeRow" 
     }, 
     isFilterPatientCases: { 
      init: true, 
      check: "Boolean", 
      event: "symbolEvent" 
     }, 
     isShow: { 
      init: true, 
      check: "Boolean", 
      event: "symbolEvent" 
     }, 
     isUnkownFilter: { 
      init: true, 
      check: "Boolean", 
      event: "symbolEvent" 
     }, 
     value: { 
      init: "", 
      event: "changeValue" 
     } 
    }, 

    members: { 
     _createChildControlImpl: function(id) { 
      var control; 

      switch (id) { 
       case "alertimage": 
        control = new qx.ui.basic.Image(); 
        control.setWidth(16); 
        this._add(control); 
        break; 
       case "suchecombobox": 
        control = new qx.ui.form.ComboBox(); 
        this._add(control, { 
         flex: 1 
        }); 
        break; 
       case "deletebutton": 
        control = new qx.ui.form.Button("Del"); 
        control.setMaxWidth(40); 
        this._add(control); 
        break; 
       case "imagecomposite": 
        control = new qx.ui.container.Composite(new qx.ui.layout.HBox(0)); 
        this._add(control); 
        break; 
      } 

      return control || this.base(arguments, id); 
     } 
    }, 

    construct: function() { 
     this.base(arguments); 

     this._setLayout(new qx.ui.layout.HBox(0)); 

     this._showImage = new qx.ui.basic.Image(); 
     this._showImage.setMaxHeight(25); 
     this._showImage.setMaxWidth(25); 
     this._showImage.setScale(true); 

     this._filterImage = new qx.ui.basic.Image(); 
     this._filterImage.setMaxHeight(25); 
     this._filterImage.setMaxWidth(25); 
     this._filterImage.setScale(true); 

     this._createChildControl("alertimage"); 
     this._createChildControl("suchecombobox"); 
     this._createChildControl("imagecomposite"); 
     this._createChildControl("deletebutton"); 

     this.getChildControl("deletebutton").addListener("execute", function(e) { 
      var itemModel = this.getModel(); 
      data.remove(itemModel); 
     }, this); 

    } 

}); 

var dataRaw = { 
    isColumn: false, 
    isFilter: false, 
    isFilterPatientCases: true, 
    isRow: true, 
    isShow: true, 
    isUnkownFilter: true, 
    position: "row", 
    queryText: "Dia:I50_:_Herzinsuffizienz", 
    textType: "" 

}; 
var data = qx.data.marshal.Json.createModel([dataRaw]); 

var list = new qx.ui.form.List(); 
list.setWidth(200); 
var listController = new qx.data.controller.List(null, list); 

listController.setDelegate({ 
    bindItem: function(controller, item, index) { 
     controller.bindProperty("", "model", null, item, index); 
     controller.bindProperty("queryText", "value", null, item.getChildControl("suchecombobox"), index); 
     controller.bindProperty("isFilter", "isFilter", null, item, index); 
     controller.bindProperty("isColumn", "isColumn", null, item, index); 
     controller.bindProperty("isRow", "isRow", null, item, index); 
     controller.bindProperty("isFilterPatientCases", "isFilterPatientCases", null, item, index); 
     controller.bindProperty("isShow", "isShow", null, item, index); 
     controller.bindProperty("isUnkownFilter", "isUnkownFilter", null, item, index); 
     controller.bindProperty("queryText", "value", null, item, index); 


    }, 
    createItem: function() { 
     return new CustomListItem(); 
    } 
}); 

listController.setModel(data); 

listController.addListener("changeSelection", function(e) { 
    console.log(e.getData().toArray()); 
}, this); 

var doc = this.getRoot(); 

var button = new qx.ui.form.Button("AddItem"); 
var newIndex = 1; 
button.addListener("execute", function(e) { 
    dataRaw.queryText = "New (" + (newIndex++) + ")"; 
    data.append(qx.data.marshal.Json.createModel([dataRaw])); 
}, this); 

doc.add(list, { 
    left: 0, 
    top: 0 
}); 

doc.add(button, { 
    left: 200, 
    top: 0 
}); 
+0

Не знаю, должен ли я открыть сейчас Thread, но контекст тот же. Можно ли выбрать Listitem, если я нажму в поле со списком? –

+0

Это похоже на то, что вы изменили свойство 'selected' контроллера (это экземпляр' qx.data.Array'), чтобы включить элемент модели, и контроллер обновит пользовательский интерфейс. На самом деле, если у вас есть экземпляр 'CustomListItem' и измените' qx.ui.form.List.selected', чтобы включить его, тогда контроллер также удостоверится, что его свойство 'selected' обновлено с помощью правильной модели, поэтому оно двунаправлено – johnspackman

Смежные вопросы