2015-12-30 99 views
0

这里是我的指令:通功能,以指令

module app.directives { 

    interface IDmDeleteIconController { 
     doAction(): void; 
    } 

    class DmDeleteIconController implements IDmDeleteIconController { 

     static $inject = ['$scope']; 
     constructor(public $scope:any) { 
     } 

     doAction() { 
      console.log('1'); 
      this.$scope.dmAction(); 
     } 
    } 

    export class DmDeleteIcon implements ng.IDirective { 

     templateUrl = './app/common/directives/deleteIcon/deleteIcon.html'; 
     controller = DmDeleteIconController; 
     controllerAs = 'dmDeleteIconVm'; 

     scope = { 
      dmAction: '&' 
     }; 

     link = (scope: any, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ctrl: any) => { 
      console.log('2'); 
      scope.dmAction(); 
     } 

     static factory(): ng.IDirectiveFactory { 
      const directive =() => new DmDeleteIcon(); 
      directive.$inject = []; 
      return directive; 
     } 
    } 

    angular.module('myApp').directive('dmDeleteIcon', DmDeleteIcon.factory()); 
} 

在这里,我尝试使用它:

​​

当我打开网页,我会在控制台中2(从link函数),但我没有从我传递给指令的函数中获得hello

为什么以及如何解决?

更新:

这里是一个指令的模板:

a.item-detail-delete-icon(class="form-image-link" href="" ng-click="dmDeleteIconVm.doAction()") 

这里是HTML到我的玉编译:

<dm-delete-icon dm-action="console.log('hello');"></dm-delete-icon> 

更新2:

我试图用这样的:

<dm-delete-icon dm-action="vm.foo()"></dm-delete-icon> 

其中:

foo(): void { 
     console.log("hello");  
    } 

控制器的功能。

更新3:

如果我试图调试代码,我会得到这样的:

enter image description here

enter image description here

+0

您是否可以在整个HTML标签中使用它? – toskv

+0

你是指我从Jade那里得到的指令模板或HTML吗?我已将它们都添加到我的问题中 – demas

+0

您没有为属性“dm-action”提供函数。 'console.log'不是一个函数,所以之后应该如何用'dmAction()'调用它。 – FlorianTopf

回答

2

这里的问题是,你传递给该指令表达式console.log('hello');将在父控制器作用域上执行。

这基本上意味着你需要有console对象附加到范围,并在该对象下的方法log。角度表达式不适用于全局变量(在这种情况下为console)。

只要确保传递给指令的表达式是有效的角度表达式即可。例如 - 在名为myConsoleLog的应用范围上创建新方法,该方法将某些内容打印到控制台并将该指令的属性值更改为dm-action="myConsoleLog();"

+0

我已更新我的问题。我之前试图传递控制器的功能,但它不适合我。 – demas

+0

我添加了调试器截图。可能会有助于找到问题。 – demas

+0

我找到了问题。我需要添加';'。所以'dm-action =“vm.foo()”'应该是'dm-action =“vm.foo();”' – demas