I have this combobox.

The combobox is populated by a webservice.

When the webservice result arrives, I have a utility function that
adds a 'Pick an item...' sort of option at the top of the dropdown,
and then selects the appropriate selected item.  If there is no
appropriate selected item, it picks index 0 (the dummy 'Pick an
item...').

I have a validator that validates that the combobox has a real
selection.

The problem is... I want my utility function to happen in "stealth"
mode. If the user changes the combobox, I want it to be validated. But
if I programatically set the selectedIndex, I don't want any events to
fire and trigger validation.

Ironically, I read that in Flex 1.0, changing the selectedIndex did
not fire a change event, but this was "fixed" in 1.5. The old behavior
is precisely what I want. Any way to temporarily bypass that change
event firing?

Code included below... Thanks for your help!

-Tim.




[ComboBoxValidator.as]


import mx.controls.*;
import mx.validators.*;

/* ComboBoxValidator
 *
 * Validate that a user does not select the dummy option (eg.
 * 'Pick a value...') in a required combobox.
 *
 */
class ComboBoxValidator extends Validator
{
   public function doValidation(foo:String) : Void
   {
      var n = Number(foo);
      if (n == 0)
      {
         validationError("noSelection", "Field is required.", null);
      }
   }
}





[Test.mxml]


<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml";
                xmlns:dom="*"
                creationComplete="start()">

    <mx:Script>
    <![CDATA[
        import mx.controls.*;
        import mx.containers.*;
        import mx.managers.*;
        import mx.validators.*;

        import com.dom.sampling.vo.*;

        var model : SampleSite;

        var PICK_A_FACILITY_TYPE : FacilityType;

        /* start()
         *
         * Perform basic setup.
         *
         */
        function start()
        {
            PICK_A_FACILITY_TYPE      = new FacilityType();
            PICK_A_FACILITY_TYPE.name = "Choose a facility type...";
            service.getAllFacilityTypes();

            if (!model)
            {
                model = new SampleSite();
            }
        }

        /* prepareCombobox()
         *
         * Prepares a combobox by adding a first, descriptive
         * option (eg. 'Pick a value...') to the dropdown. It
         * also sets the initial value of the combobox, either
         * to the item matching the passed in initialValue, or
         * if no match is found, to the first item in the
         * combobox.
         *
         * @param combobox      the combobox to prepare
         *
         * @param pickAValue    the first, descriptive option
         *                      (eg. 'Pick a value...') to add
         *                      to the combobox
         *
         * @param initialValue  the initialValue the combobox
         *                      should be set to
         */
        public function prepareComboBox(combobox: ComboBox,
                                        pickAValue: Object,
                                        initialValue: Object) : Void
        {
            if (pickAValue)
            {
                combobox.addItemAt(0, pickAValue);
                combobox.selectedIndex = 0;
            }

            if (initialValue)
            {
                for (var i=0; i < combobox.length; i++)
                {
                    var item = combobox.getItemAt(i);

                    // object
                    if (item instanceof Object &&
                        item.id == initialValue.id)
                    {
                        combobox.selectedIndex = i;
                    }

                    // non-object
                    else if (item == initialValue)
                    {
                        combobox.selectedIndex = i;
                    }
                }
            }
        }

    ]]>
    </mx:Script>

    <mx:WebService id="service"
                   wsdl="/sampling-ws/services/LocationService?wsdl"
                   showBusyCursor="true">

        <mx:operation name="getAllFacilityTypes"
                      result="prepareComboBox(facilityType,
PICK_A_FACILITY_TYPE, model.facilityType)"/>

    </mx:WebService>

    <mx:Panel title="Administer Sample Site" width="100%">
        <mx:FormItem width="100%" required="true" label="Facility
Type">
            <mx:ComboBox id="facilityType"
dataProvider="{service.getAllFacilityTypes.result}"
labelField="name"/>
        </mx:FormItem>
    </mx:Panel>

    <mx:Model id="validationModel">
        <facilityType>{facilityType.selectedIndex}</facilityType>
    </mx:Model>

    <dom:ComboBoxValidator required="true"
field="validationModel.facilityType"/>

</mx:Application>




 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/flexcoders/

<*> To unsubscribe from this group, send an email to:
    [EMAIL PROTECTED]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
 



Reply via email to