【问题标题】:Angular JS Parent Scope Click Handler Not DestroyedAngular JS父范围点击处理程序未销毁
【发布时间】:2015-04-09 13:20:35
【问题描述】:

这是我的html

<div controller="parent">
<button ng-click="doSomething()"><Click</button>
<div ng-view></div>
</div>

这是我用于特定视图的 js 控制器:

function child($scope) {
   $scope.$parent.doSomething = function() {
      // do http request or seomthing else
   }
}

现在,当我在子控制器视图上时,当我单击父范围上的按钮时,angular 会发出 http 请求,但是当我导航到具有不同控制器的其他视图时(当然),当我点击时,angular 仍然会发出 http 请求父作用域上的按钮。

我认为当视图更改时,控制器及其范围将被销毁,从而有效地删除对该特定范围对象的引用。

我的解决方法是监听 $scope.on('$destroy') 并覆盖该函数以返回空或其他内容。

有没有更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: angularjs scope


    【解决方案1】:

    $scope.$parent.doSomething 正在将 doSomething 属性添加到该父 $scope 对象。只要该父作用域没有被破坏,您的点击处理程序就会一直存在。

    【讨论】:

    • 好的,谢谢.. 没有办法做到这一点吗?我的意思是也许我可以尝试监听路由变化然后覆盖点击处理程序?
    • 您可以让父作用域在作用域下广播一个事件,然后在每个接收它的子作用域中按照您希望的方式处理该事件。编辑:这意味着对父级的 ng-click 将执行 $scope.$broadcast("SomeEventName") 并且您想要接收和处理该单击事件的每个子级都可以使用 $scope.$on( "SomeEventName", function(event){ ... }
    • 是的,但我仍然必须在作用域破坏时解除对侦听器的绑定,对吧?
    • 不,只需在您的每个子控制器中适当地处理它。如果您不关心某些视图中的单击事件,那么甚至不必费心在那些控制器上监听它。否则,您可以在 $scope.$on 函数内部设置某种条件检查,以防止内部代码执行。 $scope.$on("SomeEventName", function(event){ if (someConditionalCheck){ // do something if true, otherwise, do nothing } });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多