javascript - 使用AngularJS上的Typecript指令中的控制器范围

javascript - 使用AngularJS上的Typecript指令中的控制器范围,第1张

我正在继续学习Typescript和AngularJS,并对范围提出了疑问。我正在开展一个项目,项目中的每个人都负责指令。但是我最近在理解中遇到了障碍。

目前我有一个html页面,其中包含以下内容

<html ng-app ="helloworld">
    <head>
        <!--insert scripts here-->
    </head>
    <body>
       <direct-a></direct-a>
       <hello-world></hello-world>
    </body>
</html>

我们已经将指令设置为以下内容:

/// <reference path="../../../typings/tsd.d.ts" />
module helloWorld{

var app :angular.IModule = angular.module('helloWorld');

app.directive('helloWorld', HelloWorldDirective);

    function HelloWorldDirective() :ng.IDirective{

        return <ng.IDirective>{
            controller: 'HelloWorldController',
            controllerAs : 'vm',
            templateUrl: './app/HelloWorld/HelloWorld.html'          

        };

};

}

我在<direct-a>指令上有相似的代码,但是使用代码,我无法看到<hello-world>标记中的任何内容,直到我们将controllerAs更改为其他内容&#39; VM&#39 ;.这让我想知道我们是否需要为自定义指令设计命名约定,而不是使用&#39; vm&#39; controllerAs的短语?或者我在这里缺少一个技巧?

最佳答案:

1 个答案:

答案 0 :(得分:3)

我创建了两个例子:

  • 有is BROKEN plunker
  • 有is fully WORKING plunker

BROKEN

这就是我创建 <hello-world> 指令(与此How can I define my controller using TypeScript?相关)的方式

module HelloWorld
{
    var app = angular.module('TheApp');

    export class HelloWorldDirective implements ng.IDirective
    {
        public restrict: string = "E";
        public replace: boolean = true;
        public template: string = "<div>"  
            "<input ng-model=\"vm.MyValue\" />"  
            "<button ng-click=\"vm.Show()\" >Show my value</button>"  
            "<p> my value <b>{{vm.MyValue}}</b></p>"  
            "</div>";
        public controller: string = 'HelloWorldCtrl';
        public controllerAs: string = 'vm';
        //public scope = {};
    }    
    app.directive("helloWorld", [() => new HelloWorld.HelloWorldDirective()]);

    export interface IHelloWorldScope  extends ng.IScope
    {
        // properties for isolated scope
    }
    export class HelloWorldCtrl
    {
        static $inject = ["$scope"];
        constructor(protected $scope: HelloWorld.IHelloWorldScope){ }
        public MyValue: string = "InitValue";
        public Show(): void
        {
            alert(this.MyValue)
        }
    }
    app.controller('HelloWorldCtrl',  HelloWorld.HelloWorldCtrl);
}

这是 <other-directive> TypeScript代码:

module OtherDirective
{
    var app = angular.module('TheApp');

    export class OtherDirectiveDirective implements ng.IDirective
    {
        public restrict: string = "E";
        public replace: boolean = true;
        public template: string = "<h4>"  
            "OtherValue: {{vm.OtherValue}}"  
            "</h4>";
        public controller: string = 'OtherDirectiveCtrl';
        public controllerAs: string = 'vm';
        //public scope = {};
    }

    app.directive("otherDirective", [() => new OtherDirective.OtherDirectiveDirective()]);

    export interface IOtherDirectiveScope  extends ng.IScope
    {
      // properties for isolated scope
    }
    export class OtherDirectiveCtrl
    {
        static $inject = ["$scope"];
        constructor(protected $scope: OtherDirective.IOtherDirectiveScope) {}
        public OtherValue: string = "This is other Value";
    }
    app.controller('OtherDirectiveCtrl',  OtherDirective.OtherDirectiveCtrl);
}

所以,如果我们将这两个并排放置:

<div>
    <hello-world></hello-world>
    <other-directive></other-directive>
</div>

<hello-world> 无法正常工作。它会被打破。原因是&#34;共享&#34; 非隔离范围,这两个指令都可以访问。

让它工作

要修复它,我们必须更改(在这个简单示例中至少有一个)或为controllerAs 使用不同的名称。

检查文档(Angular Directive Guide)

  

隔离指令的范围

     

我们上面的myCustomer指令很棒,但它有一个致命的缺陷。我们只能在给定范围内使用一次   ...
  我们希望能够做的是将指令内的范围与外部范围分开,然后将外部范围映射到指令的内部范围。我们可以通过创建我们称之为隔离范围的方法来实现。为此,我们可以使用指令的范围选项:

在这里,我们将要求隔离范围

export class HelloWorldDirective implements ng.IDirective
{
    public restrict: string = "E";
    public replace: boolean = true;
    public template: string = "<div>"  
        "<input ng-model=\"vm.MyValue\" />"  
        "<button ng-click=\"vm.Show()\" >Show my value</button>"  
        "<p> my value <b>{{vm.MyValue}}</b></p>"  
        "</div>";
    public controller: string = 'HelloWorldCtrl';
    public controllerAs: string = 'vm';
    // isolated scope requested
    public scope = {};
}

export class OtherDirectiveDirective implements ng.IDirective
{
    public restrict: string = "E";
    public replace: boolean = true;
    public template: string = "<h4>"  
        "OtherValue: {{vm.OtherValue}}"  
        "</h4>";
    public controller: string = 'OtherDirectiveCtrl';
    public controllerAs: string = 'vm';
    // isolated scope requested as well
    public scope = {};
}

检查行动here 关于这种方法的更多信息:

  • How can I define my controller using TypeScript?
  • How To bind data using TypeScript Controller & Angular Js
本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复