1

So I have been exploring the Controller as syntax in AngularJS, and I want to know how to deal with directives and $scope, specifically inheritance of the controllers $scope or properties from a child directive.

I am using Typescript, so given this controller:

export class DefaultController implements IDefaultController {
    customer: Models.ICustomer;

    static $inject = ['$scope', 'config', 'customerDataService'];

    constructor(private $scope: ng.IScope, private config: ApplicationConfig, private customerDataService: Services.ICustomerDataService) {

    }

    getCustomerById(id: number): void {
        console.log(this.config.version);
        this.customerDataService.getCustomer(id).then((customer) => {
            this.customer = angular.extend(new Models.Customer(), customer);

        });
    }
}

How would I go about passing the customer down to a directive which would typically inherit the $scope of the parent controller.

1 Answer 1

1

In case we would declare as like this (inside of a View):

<div ng-controller="DefaultController as Events">
 ...

Almost the same for Directive def:

export class MyDefaultDirective implements ng.IDirective
{
    public restrict: string = "E";
    public replace: boolean = true;
    ...
    public controller: string = "DefaultController as Events";
    ...

We can expect, that the instance of this controller will be injected into $scope like this:

// this was done by angular
// - the 'as' part was used for a property name
// - current controller instance was injected 
var controller = this.$scope.Events;

So we can now access any public stuff of our controller. A bit simplified (but exact) version of the above controller snippet:

export class DefaultController implements IDefaultController {
    // explicit public just to show that this will be available
    public customer: Models.ICustomer;
    ....

    getCustomerById(id: number): void {
        this.customerDataService.getCustomer(id).then((customer) => {

            // HERE
            // this.$scope.Events.customer is ready for use
            this.customer = angular.extend(new Models.Customer(), customer);
      ...

In our View (once loaded via $http) we can consume above result like this:

<div>
  {{Events.customer}} // public propeties of this.$scope
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.