Alpha Video Training
Results 1 to 2 of 2

Thread: UX isDirty Discussion

  1. #1
    Banned
    Real Name
    David Kates
    Join Date
    Apr 2008
    Location
    Unionville, ON
    Posts
    7,819

    Default UX isDirty Discussion

    This is a really interesting subject because there are a more than a few posts over the years... and just recently, regarding the isDirty state of a UX... and how to set it Clean manually. In the normal course of events you shouldn't need to do this... but we all know "normal" is not always the case.

    The information here deals with both the Data Bound and Unbound UX. I'm not positive I've got all of it... but... it's a discussion.

    There's a whole lot going on when a UX goes dirty... or clean.

    This method does some of the job...

    Code:
    {dialog.Object}._setRowState(1,false);
    I believe this does the same as the following four statements...

    Code:
    {dialog.Object}._isDataDirty = false;
    {dialog.Object}._isDirty = false;
    {dialog.Object}._dirtyRows[0] = false;
    {dialog.Object}.refreshClientSideComputations();
    But... doing only this part leaves the UX in an odd state... because the data control that is dirty, is still marked as dirty.

    Rich mentioned ._setRowState and Frank mentioned .setAttribute for a5IsDirty... but these 2 need to be used together in order to return the UX to a clean state. NOTE... not the data... but rather the state of the UX.

    Using ._setRowState by itself results in an odd looking behaviour: Make a control dirty, use ._setRowState, and then alter that same control again. The UX does not go dirty... because the a5IsDirty attribute for that control is already "true" and therefore it does not trigger the "dirty" process for the UX. The odd looking behaviour is that if you focus on another control after making your first control dirty again, then the UX does go dirty.

    So... we need to alter all the "dirty" properties of the UX... and... alter all the "a5IsDirty" attributes of any dirty controls.

    We know how to change the "dirty" properties... now how do we alter a5IsDirty?

    If using a Data Bound UX we have the property {dialog.Object}._dataBoundControls. This is an Array of all the Data Bound Controls. We can loop through this array do the work.
    For an Unbound UX we need to do something else. We can use the Object property {dialog.Object}.columnInfo. This is an Object of column Objects. We can loop through this Object grabbing the keys... which are the Column Names. We can push those names into an Array and then work on a5IsDirty.
    A Data Bound UX also has {dialog.Object}.columnInfo so, actually, we can just use that for Data Bound or Unbound.

    Looping through the Array of Column Names, we use $ga to get access to a5IsDirty. If it's "true" then we push that element into an Array of dirty elements.

    Once we have our Array of dirty elements, we can use $sa to reset all the a5IsDirty attributes to false.

    Doing this, the odd looking behaviour is now gone. You can alter the originally changed control... and the UX will go dirty again right away.

    Here is the code for doing all this...

    Code:
    //take care of the UX dirty properties... setting them back to clean.
    {dialog.Object}._setRowState(1,false);
    
    //use the Data Bound UX _dataBoundControls to get an array of columns
    var columnNames = {dialog.Object}._dataBoundControls;
    
    //using a Data Bound or Unbound UX, you can also use the dialog object columnInfo
    //var columnNames = [];
    //for(var k in {dialog.Object}.columnInfo) columnNames.push(k);
    
    //now, loop through the columns and use $ga to get the a5IsDirty attriubte value
    //if a5IsDirty is "true" then add it to an array of dirty elements
    var dirtyEle = [];
    var isEleDirty;
    for(var i=0; i<columnNames.length; i++){
    	isEleDirty = $ga('{dialog.ComponentName}.V.R1.'+ columnNames[i],'a5IsDirty');
    	if(isEleDirty[0] == "true"){
    		dirtyEle.push('{dialog.ComponentName}.V.R1.'+ columnNames[i])
    	}
    }
    
    //if we have an array of dirty columns, use $sa to set the attriubte a5IsDirty to false for all the columns
    //$sa takes an Array of elements to work on.
    if(dirtyEle.length > 0){
    	$sa(dirtyEle,'a5IsDirty',"false");
    }
    The end result is a Clean UX... with... changed data. We've now separated the two... as the UX no longer automatically knows that any data has been changed.

    This is not something that Alpha would intend to do... but... Alpha let's us do some very cool things.

  2. #2
    "Certified" Alphaholic
    Real Name
    Frank Bicknell
    Join Date
    Feb 2010
    Location
    39.1915° N, 84.4348° W
    Posts
    2,467

    Default Re: UX isDirty Discussion

    Alpha let's us do some very cool things.
    Very cool...
    Win 10 64 Development, Win 7 64 WAS 11-1, 2, Win 10 64 AA-1,2, MySql, dbForge Studio The Best MySQL GUI Tool IMHO. http://www.devart.com/dbforge/mysql/studio/

Similar Threads

  1. How to manually clear the isDirty flag for a detailWin
    By sshutsell in forum Mobile & Browser Applications
    Replies: 4
    Last Post: 04-14-2017, 10:50 AM
  2. grid.isDirty = false is NOT working ...
    By drgarytraub in forum Mobile & Browser Applications
    Replies: 4
    Last Post: 10-14-2016, 06:24 PM
  3. Msgbox and isdirty question
    By jtm311 in forum Application Server Version 11 - Web/Browser Applications
    Replies: 10
    Last Post: 11-02-2015, 07:25 PM
  4. Problem using {grid.object} .isDirty
    By richard@tbdinc.net in forum Mobile & Browser Applications
    Replies: 2
    Last Post: 10-27-2014, 04:01 PM
  5. Where is best place to use IsDirty?
    By Fulltimer in forum Application Server Version 11 - Web/Browser Applications
    Replies: 3
    Last Post: 06-27-2013, 12:55 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •