2015-12-30 58 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