Uploaded image for project: 'Click'
  1. Click
  2. CLK-365

Invoke listeners after all control values have been bound


    • Type: Improvement
    • Status: Closed
    • Priority: Blocker
    • Resolution: Fixed
    • Affects Version/s: 1.5 M1
    • Fix Version/s: 1.5 M2
    • Component/s: core
    • Labels:


      When Control listeners are fired, there is no guarantee that all Control values have been bound to the incoming request. The reason for this behavior is that the #onProcess method fires the listener directly.

      The problem this creates is that the listener cannot assume a control will have its value bound. For example the following will not work:

      public MyPage extends Page {

      public void onInit()

      { Select select1 = new Select("select1"); select1.setListener(this, "onSelect1"); Select select2 = new Select("select2"); select2.setListener(this, "onSelect2"); ... }

      public boolean onSelect1()

      { // The call below will return null because select2 have // not been processed yet select2.getSelectedValues(); }

      public boolean onSelect2()

      { // The call below will return select1 selected values because // select1 have been processed select1.getSelectedValues(); }


      I have been burned by this before and think we should improve this a little.

      By delaying the listener invocation until all controls have been processed should solve this issue. In other words instead of invoking the listener from the #onProcess method, we instead register the listener to the Context, and once all Controls have been processed, we invoke all the registered listeners.




            • Assignee:
              sabob Bob Schellink
              sabob Bob Schellink
            • Votes:
              0 Vote for this issue
              0 Start watching this issue


              • Created: