2016-10-22 2 views
1

적어도 하나의 항목이 선택되어 있고 선택한 항목의 수를 더 바인딩하려는 경우에만 단추를 활성화해야합니다.고급 qooxdoo 컨트롤러 선택 바인딩?

이상적 컨버터 기능하지 않고, 더 나은 솔루션이 있습니까 :

// 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(); 
    } 
}); 

그것은, 하지만 작동 : 나는 다음과 같은 솔루션 (run in qooxdoo Playground)에 온 바인딩을 적용 할 때 변환 기능을 사용

?

"isSelected"또는 "selection.length"와 같은 속성을 검색하지 않았습니다. 내가 바인딩 시스템을 이해하려면 내가 뭔가를 놓친 것 같아 ...

도 덜 우아 바인딩하지 않고, 이벤트를 통해 버튼을 활성화/비활성화, 그것은 처음에 비활성화 된 버튼이 필요합니다

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

답변

1

isSomethingSelected 플래그가 있어도 바인딩이 필요합니다.

선택qx.data.Array, 그래서 당신은 길이 변화를 수신하여 비트 코드를 단순화 할 수 있습니다 - 중 부울 계산기에 와 결합함으로써, 또는 변경 리스너 : 버튼에서 선택한 항목의 수를 원하는 경우

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

후자는 의미가 있습니다. 앞에서 설명한 것처럼 처음에는이 버튼을 비활성화해야합니다.