How best to deal with async BDM API data not showing up in custom widget controller?

Hi,

I have a process instantiation form that uses a custom data table widget to present data to a user.

The table content is in a form-defined variable of type “external API”, the API being /API/bdm/businessData/com.company.model…

The table column definitions, etc are also form-defined variables, they have been given fixed content.

When the process initiates the custom widget controller receives column definitions, etc. through the $scope.properties.xxxx variables - except for the table content, derived from the external API call, which is undefined. The call is correct for I see the desired table row objects when I use a text widget for display of the BDM array of objects received through the API.

I can call the BDM API directly in the custom widget controller using $http.get but this seems it should be unnecessary. Is there a simpler way to get the information to the controller when it is called? The standard table widget does not seem to have any difficulty and I don’t see any special handling (watchers, callbacks, etc) in its controller.

Ok, after a fair bit of trial and error…

I wrapped the entirety of the controller code in a watch function like this:

function controller ($scope) {

var tableUpdates = ;
var newValue = ;
var tableRows = ;

// Wait for data from API call
$scope.$watch(function(scope) { return scope.properties.rowObjects },
function(newValue, oldValue) {
tableRows = newValue;

// Then carry on doing stuff…

}); // end of watch function
} // end of controller

I also found that to get updates to $scope.properties.xxxx variables, in this case the table updates, back to the page/form I needed to call the $scope.$apply() function like this:

        { text:   'Save and Quit Editor',
           init: function () {
                    this.disable();
                  },
           action: function (e, dt, node, config) {
               $scope.properties.tableUpdates = tableUpdates;
               console.log('End and save updates',$scope.properties.tableUpdates);
               $scope.$apply();
               $("div").remove(".panel");
               table.clear();
               $('#example').DataTable().destroy(true);
            }
         },

//