我正在使用ionicframework和TypeScript。当我创建一个模态对象时,如下所示,模态对象是成功创建的,但在回调中它所说的内容。$ scope.modal = modal; 此引用了浏览器窗口,因此$ scope未定义。我怎样才能这个指向班级?
export class MyCtrl {
constructor(private $scope: any, private $ionicModal) {
// Load the modal from the given template URL
this.$ionicModal.fromTemplateUrl('MyApp/myModal.html', (modal) => {
this.$scope.modal = modal;
}, {
// Use our scope for the scope of the modal to keep it simple
scope: this.$scope,
// The animation we want to use for the modal entrance
animation: 'slide-in-up'
});
答案 0 :(得分:3)
在TypeScript中,lambda中的this
在JavaScript中没有this
的传统行为。如果你看一下编译好的JS,就会明白发生了什么,但基本上它通常会比你期望的更高 - 在你的情况下是窗口对象。
解决此问题的最简单方法是使用注释在行上方var self=this;
,然后在lambda中引用self
,或者只使用普通函数语法,例如{{1}它保留了JS的function(modal) {
的传统功能。
Dan Quirk回答了我在这里提出的类似问题:https://typescript.codeplex.com/workitem/1655
您可能还希望看一下:Can I access the other this in a TypeScript lambda?
答案 1 :(得分:3)
如果您拨打new MyCtrl($myScope, $ionicModal)
之类的内容,则对this
的引用会正确指向MyCtrl
的新实例。
我怀疑你是否将MyCtrl
类传递到Angular期望函数而不是类的地方!
由于JavaScript的一个令人困惑的方面,你的代码实际上失败了,即构造函数可以(错误地)用作普通函数而不使用new
,在这种情况下this
将指向更高的值起来。
解决方案是使用普通函数而不是类,尝试:
function myCtrl($scope: any, $ionicModal) {
// Load the modal from the given template URL
$ionicModal.fromTemplateUrl('MyApp/myModal.html', (modal) => {
$scope.modal = modal;
}, {
// Use our scope for the scope of the modal to keep it simple
scope: $scope,
// The animation we want to use for the modal entrance
animation: 'slide-in-up'
});