在JQuery$destroy之前执行函数

Executing a function before JQuery $destroy

本文关键字:执行 函数 destroy JQuery      更新时间:2023-09-26

我有一段类似的代码

$('#id').on('$destroy', function(){
                ...
            }
})

我希望这个函数由destroy事件触发,但它应该在destroy之前执行,现在它正在destroy之后执行。有人能建议如何实现这一点吗?

使用$broadcast作为代理调用$destroy:

function beforeDestroy(event, options) 
  {
  console.log(String().concat("Event: ", event,"Old: ", options.oldValue, "New: ", options.newValue);
  /* 
  execute stuff before calling destroy 
  ....
  ....  
  */
  /* Manually call destroy when done */
  $scope.$broadcast("$destroy");
  }
/* Bind Callback */
$scope.$on("beforeDestroy", beforeDestroy)
/* Trigger Broadcast Event */
$scope.$broadcast("beforeDestroy", { newValue: $scope.id++, oldValue: $scope.id });

$transclude函数不再将$destroy事件处理程序附加到transclude内容,因此,如果使用直接DOM操作(如jquery remove()方法)从DOM中删除transclude元素,则关联的transclude作用域将不会自动销毁。

如果您想显式删除指令中已编译的DOM元素,并且这些元素可能包含子(和transcluded)作用域,那么您有责任获得该作用域并同时销毁它。

建议的方法是围绕您希望以这种方式操作的任何DOM元素创建一个新的自己的子作用域,并在删除其内容时销毁这些作用域-然后将自动销毁和清理任何子作用域。

请注意,所有操作DOM的内置指令(ngIf、ngRepeat、ngSwitch等)都遵循了此最佳实践,因此,如果您只使用这些指令来操作DOM,则不必担心此更改。

参考

  • 范围:$broadcast

  • AngularJS更改日志:1.3.0-rc.4中断更改