use*_*512 15 angularjs typescript
我正在尝试使用TypeScript创建一个AngularJS指令.我的指令需要'ngModel',我也使用在我的指令中注入的自定义服务.我的主要问题是我的服务无法在我的链接功能中使用.
这是我想要实现的一个例子:
module app.directives {
export var directiveName: string = "theDirective";
angular.module("myApp").directive(directiveName,
(myFactory: app.services.MyFactory) =>
{
return new MyDirective(myFactory);
});
export interface IMyDirectiveScope extends ng.IScope {
ngModel: ng.INgModelController;
}
export class MyDirective implements ng.IDirective {
restrict = "A";
require = "ngModel";
scope = {
ngModel:'='
}
constructor(private myFactory: app.services.MyFactory) {
}
link(scope: IMyDirectiveScope , elem: JQuery, attributes: ng.IAttributes, ngModel: ng.INgModelController) {
//this is window here
elem.bind('blur', (evt: JQueryEventObject) => {
//keyword this is also window here, so yeah bummer indeed
validate();
});
function validate() {
//I need to use my factory here, but I can seem to get it.
//this is always window and I'm kinda stuck here
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法在这个主题上找到更高级的东西.我找不到所有的例子似乎没有使用服务或复杂的链接功能.请用某种方式回答这个问题.你觉得这很狡猾.
更新:我的链接功能中的'this'是窗口而不是'MyDirective'的事实对我来说没有多大意义.任何想法为什么会这样?
tan*_*y_k 22
使用类和继承自ng.IDirective是使用TypeScript的方法.
TypeScript包括对() =>EcmaScript 6中的胖箭头功能的支持.它是一种速记语法,它也改变了this关键字的工作方式:
class MyDirective implements ng.IDirective {
restrict = 'A';
require = 'ngModel';
scope = {
ngModel: '='
}
constructor(private myFactory: app.services.MyFactory) {
}
link = (scope: IMyDirectiveScope, elem: JQuery, attributes: ng.IAttributes, ngModel: ng.INgModelController) => {
console.log(this); // this points to MyDirective instance instead of Window
elem.bind('blur', (evt: JQueryEventObject) => {
console.log(this); // this points to MyDirective instance instead of Window
this.validate();
});
}
validate() {
console.log(this); // this points to MyDirective instance instead of Window
}
static factory(): ng.IDirectiveFactory {
var directive = (myFactory: app.services.MyFactory) => new MyDirective(myFactory);
directive.$inject = ['myFactory'];
return directive;
}
}
app.directive('mydirective', MyDirective.factory());
Run Code Online (Sandbox Code Playgroud)
你也可以依靠旧的时尚var self = this;模式:
class MyDirective implements ng.IDirective {
restrict = 'A';
require = 'ngModel';
scope = {
ngModel: '='
}
constructor(private myFactory: app.services.MyFactory) {
}
link = (scope: IMyDirectiveScope, elem: JQuery, attributes: ng.IAttributes, ngModel: ng.INgModelController) => {
console.log(this); // this points to MyDirective instance instead of Window
var self = this;
function validate() {
console.log(self); // self points to MyDirective instance
}
elem.bind('blur', function(evt: JQueryEventObject) {
console.log(self); // self points to MyDirective instance
validate();
});
}
}
Run Code Online (Sandbox Code Playgroud)
相关回答:https://stackoverflow.com/a/29223535/990356
rob*_*rob 16
类对控制器和指令控制器很有用,但我认为我不会在整个指令中使用一个.但如果你想要,你可能不得不这样做:
export class MyDirective implements ng.IDirective {
public link;
restrict = "A";
require = "ngModel";
scope = {
ngModel:'='
}
constructor(private myFactory: app.services.MyFactory) {
this.link = this.unboundLink.bind(this);
}
unboundLink(scope: IMyDirectiveScope , elem: JQuery, attributes: ng.IAttributes, ngModel: ng.INgModelController) {
//Now you should be able to access myFactory
this.myFactory.doSomething();
elem.bind('blur', (evt: JQueryEventObject) => {
//keyword this is also window here, so yeah bummer indeed
validate();
});
function validate() {
//I need to use my factory here, but I can seem to get it.
//this is always window and I'm kinda stuck here
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:没有课,你可以做这样的事情:
angular.module("myApp").directive("theDirective",
function(myFactory: app.services.MyFactory) {
return {
restrict: 'A',
require: 'ngModel',
scope: {'ngModel': '='},
link: function(scope: IMyDirectiveScope , elem: JQuery, attributes: ng.IAttributes, ngModel: ng.INgModelController) {
//You can access myFactory like this.
myFactory.doSomething();
}
}
}
);
Run Code Online (Sandbox Code Playgroud)