【问题标题】:Stop event listeners on '$destroy'. TypeError: $on is not a function;停止“$destroy”上的事件侦听器。 TypeError: $on 不是函数;
【发布时间】:2016-11-16 11:49:43
【问题描述】:

我试图在作用域被破坏时停止所有事件侦听器。

我收到此错误:

TypeError: vm.$on is not a function; 

vm.on(..) 都不起作用

    angular.module('app.layout')
      .controller('DashboardController', DashboardController);

      DashboardController.$inject = ['$interval','dataservice'];


      function DashboardController($interval, dataservice) {
        var vm = this;
        vm.name = "DashboardController";


        console.log('Init Dashboard Controller');
        initEvents();
/*
 ...
*/

    /////////////////////////////

    function initEvents() {
          vm.$on('$destroy', function() {
            vm.stop();
            console.log('DashboardController scope destroyed.');
          })
        }

【问题讨论】:

  • vm 是控制器,而不是范围。在这种情况下,您需要注入 $scope 服务。
  • 我不是 AngularJS 人,但 $on 是 $scope 方法...

标签: javascript angularjs angular-controller angularjs-events


【解决方案1】:

问题是vm 没有声明$on(...,您必须改用$scope。将其注入您的控制器并声明为$scope.$on

当使用controllerAs 语法时,这经常被误解为根本不应该使用$scope。但是,建议避免将$scope 用于某些活动,而不是从控制器中取消它。 Scope 总是存在的,它是控制器的内部,只是不要像视图模型那样使用它,但无论如何你都可以将它用于诸如监听事件、广播、emmit 等任务。

尝试类似的东西(在您的依赖项上注入 $scope 之后):

$scope.$on('$destroy', function() {
    vm.stop();
    console.log('DashboardController scope destroyed.');
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2022-10-07
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多