当使用Angular1+ES6时,控制器函数中未定义依赖注入,控制器是一个类
Dependency Injections are undefined in controller functions while using Angular1+ ES6, with controller as a class
我使用ES6类来定义我的控制器,所以这是语法,
export class SearchBarController {
constructor($log) {
'ngInject';
$log.debug("Hello");
}
textTyped($log){
$log.debug("change fired.");
}
}
视图:
<input type="text" data-ng-model="vm.txt" data-ng-change="vm.textTyped()"/>
因此,构造函数中的"Hello"被记录得很好。但是,typedText()函数中的"change-fired"没有启动,因为显然是未定义的。我如何使类函数textTyped()访问$log服务?
注意:如果我将$log分配给构造函数中的类属性,比如
this.logger = $log;
然后做,
this.logger.debug("Change fired.");
这是有效的。但我不确定这是否是正确的做法。
更新:此外,这种方法将对$log服务的引用公开给绑定到此控制器的视图。这有害吗?
有更好的解决方案吗?
this.logger = $log;
正如你所指出的,这就是方式。由于它是一个对象,因此没有全局范围。
class SearchBarController {
constructor($scope, $log) {
this.log = $log;
// Scope method
$scope.vm = this;
}
textTyped(){
this.log.debug("change fired.");
}
}
SearchBarController.$inject = ['$scope', '$log'];
试试这个
如果有人感兴趣,我使用ES6对象破坏:找到了一个更优雅的解决方案
class ABCController {
constructor($log, $http){
let vm = this;
vm.DI = () => ({$log, $http});
}
classFn(){
let vm = this;
let {$log, $http} = vm.DI();
//Now use $log and $http straightway
$log.debug("Testing");
$http({...}).then();
}
classFn2(){
let vm = this;
//you can also destructure only the required dependencies in this way
let {$http} = vm.DI();
}
}
ABCController.$inject = ['$log', '$http'];
通过这种方式,您不需要编写像vm这样丑陋/令人困惑的代码。DI.log等。同样,通过这种方式,DI在视图中暴露得更少。
相关文章:
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- Javascript/jQuery压缩一个图像正确的评论帖子,并使用Ajax Laravel 5.2保存到控制器中
- 从AngularJS中的另一个文件中的控制器访问服务
- 如何将一个变量从一个控制器传递到合金中的另一个控制器
- 如何从AngularJs中的另一个控制器访问控制器
- 相对于角度控制器中的另一个阵列过滤阵列项目
- 试图将一个局部变量传递给我的ngAside控制器
- SignalR返回到一个客户端,由控制器生成
- angularjs调用事件中控制器的一个函数
- 单击angularjs中的另一个控制器时重新加载控制器
- ASP.NET angularjs重定向到控制器的另一个视图
- $scope$观察数组中的一个特定对象——Angular JS控制器
- 如何在来自另一个文件的控制器中定义变量
- Angularjs - 观察模态窗口从另一个控制器关闭
- 在一个控制器中更新服务变量,并在另一个控制器 - Angular JS中使用更新的值
- AngularJS - 一个文件中的控制器和服务
- AngularJs 从指令中的另一个调用控制器
- 如何使用javascript express node将变量从控制器中的一个方法公开.js到另一个控制器.js
- 每个AngularJS控制器一个脚本标记