Angularjs 将函数传递给指令
这是我的指示:Angularjs 将函数传递给指令,angularjs,typescript,Angularjs,Typescript,这是我的指示: module app.directives { interface IDmDeleteIconController { doAction(): void; } class DmDeleteIconController implements IDmDeleteIconController { static $inject = ['$scope']; constructor(public $scope:an
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());
}
在这里,我尝试使用它:
dm-delete-icon(dm-action="console.log('hello');")
当我打开页面时,我将在控制台(从链接
函数)中获得2
,但我不会从传递给指令的函数中获得hello
为什么以及如何修复它
更新:
以下是指令模板:
a.item-detail-delete-icon(class="form-image-link" href="" ng-click="dmDeleteIconVm.doAction()")
以下是我的Jade编译到的HTML:
<dm-delete-icon dm-action="console.log('hello');"></dm-delete-icon>
控制器中的函数
更新3:
如果我尝试调试此代码,我将得到以下结果:
这里的问题是,您正在向指令传递一个表达式
console.log('hello')将在父控制器作用域上执行的代码>
这基本上意味着您需要将console
对象附加到作用域,并在该对象下添加一个方法log
。角度表达式不会自动处理全局变量(console
)
只需确保传递给指令的表达式是有效的角度表达式,并且该表达式应该有效。例如,在app scope上创建一个名为myConsoleLog
的新方法,将某些内容打印到控制台,并将指令的属性值更改为dm action=“myConsoleLog();”
您可以将整个html标记发布到您使用的位置吗?您是指我将从Jade中获得的指令模板还是html?我已经在问题中添加了这两个选项。您没有为属性dm action
提供函数。console.log
不是一个函数,因此以后应该如何使用dmAction()
调用它?我已经更新了我的问题。我以前试图传递控制器的函数,但它对我不起作用。@toskv,我发现了问题。我需要添加代码>。所以dm action=“vm.foo()”
应该是dm action=“vm.foo();”
。谢谢,我更新了我的问题。我以前试图传递控制器的函数,但它对我不起作用。我添加了调试器截图。也许找到问题会有帮助。我已经找到了问题。我需要添加代码>。所以dm action=“vm.foo()”
应该是dm action=“vm.foo();”
<dm-delete-icon dm-action="vm.foo()"></dm-delete-icon>
foo(): void {
console.log("hello");
}