This question took me one day to debug it, but still no luck.
Problem: this.gridOptions.data = this.allTemplatesFromClassificationRepo ;
**this.allTemplatesFromClassificationRepo ** is still a empty array. Before this line of code executes, I have call activate() function to assign array to **this.allTemplatesFromClassificationRepo **. Please see this line this.allTemplatesFromClassificationRepo = templateReorderProperties;
P.S. Although I cannot get the value of allTemplatesFromClassificationRepo in controller, but I can get the value of it in html.
namespace app.admin {
'use strict';
class FooController {
    static $inject: Array<string> = [];
    constructor() {
        this.activate();
    }
    activate() {
        this.getData();
        this.classificationFoo = this.data[0];
        this.getTemplateFromGivenRepo(this.classificationFoo.id, this.classificationFoo.displayName);
        this.populateData();
    }
    data: any;
    classificationFoo: any;
    allDataFromclassificationFoo: any = [];
    // demo grid
    gridOptions = {
        enableFiltering: true,
        },
        data: []
    };
    populateData() {
            this.gridOptions.data = this.allTemplatesFromClassificationRepo ;
    }
    getData() {
        this.fooService.getUserData();
        this.data = this.fooService.userdata;
    }
    getTemplateFromGivenRepo(fooId: string, fooName: string) {
        switch (fooId) {
            case 'FOO':
                this.TemplateApi.templatesAvaiableForRepoIdGET(fooId).then(data => {
                    data.forEach(element => {
                       element.fooName = fooName;
                    });
                    let templateReorderProperties = data
                    this.allTemplatesFromClassificationRepo = templateReorderProperties;
                }, error => {
                });
                break;
            default:
                break;
        }
    };
}
class Bar implements ng.IDirective {
    static $inject: Array<string> = [];
    constructor() {
    }
    bindToController: boolean = true;
    controller = FooController;
    controllerAs: string = 'vm';
    templateUrl: string = 'app/foo.html';
    static instance(): ng.IDirective {
        return new Bar();
    }
}
angular
    .module('app.admin')
    .directive('bar', Bar.instance);
}
 
     
    