Angularjs 手动销毁$scope tl;博士

Angularjs 手动销毁$scope tl;博士,angularjs,angularjs-scope,oclazyload,Angularjs,Angularjs Scope,Oclazyload,应用程序加载模块,每X分钟刷新一次,在重新加载时不会销毁模块实例$scope.$on(“$destroy”)不会被调用。模块DDoS API和减速应用程序。从应用控制器手动$broadcast触发销毁(代码如下)。当$scope.$destroy()给出“当前为空”错误时,如何手动卸载控制器实例 更详细的解释 我目前正在开发一个仪表板风格的应用程序,它使用angularjs模块作为小部件。这些都是使用ocLazyLoad动态加载的,以减少应用程序加载时间。所有内容都来自JSON API 仪表板每

应用程序加载模块,每X分钟刷新一次,在重新加载时不会销毁模块实例<代码>$scope.$on(“$destroy”)不会被调用。模块DDoS API和减速应用程序。从应用控制器手动
$broadcast
触发销毁(代码如下)。当
$scope.$destroy()
给出“当前为空”错误时,如何手动卸载控制器实例

更详细的解释 我目前正在开发一个仪表板风格的应用程序,它使用angularjs模块作为小部件。这些都是使用ocLazyLoad动态加载的,以减少应用程序加载时间。所有内容都来自JSON API

仪表板每30分钟重新加载一次它的小部件(下面的更新代码),同时重建视图。当这种情况发生时,现有的小部件不会被销毁并保留在内存中。也就是说,每X分钟,它们被设置为更新的情况也会继续发生。因此,当应用程序运行2小时时,每X秒有4个小部件实例请求数据。当仪表板重新加载其小部件时,不会对旧实例调用销毁事件,因为这些实例从未被销毁

我已经通过让仪表板控制器广播销毁事件部分修复了这一问题,因此运行的控制器会清理它们的
$timeout
s,但是这显然不会从内存中删除加载的小部件实例。尝试调用
$scope.$destroy()
会导致
当前为null
错误,并使用下面的元素删除代码

问题是,我怎样才能摧毁这些控制器

代码块 摧毁广播接收机

$scope.$on("destroy", function () {
    console.log("RMA Widget scope received destroy event. Destroying RMA widget");
    $scope.$destroy();
});
删除模块(小部件)元素

加载模块(小部件)<代码>$scope.widgets用于正文中的
ng repeat

$scope.widgets         = [];
for (let i = 0; i < rqData.data.data.widgets.length; i++) {
    const widget = rqData.data.data.widgets[i];
    $ocLazyLoad.load('app/' + widget.type + '/module.js');
    $scope.widgets.push({
        directive   : widget.type + '-widget',
        module      : 'app/' + widget.type + '/module.js',
        view        : 'app/' + widget.type + '/view.html',
        data        : Object.assign(widget.widget_id,
            {item_id : widget.id, content : widget.content}),
    });
}
$scope.timeout.compile = $timeout($ctrl.compileView, 3000);
$scope.widgets=[];
for(设i=0;i
如果使用的是
ng repeat
,则删除变量
$scope.widgets
并重新设置就足够了。我的意思是用
delete$scope.widgets
也许是这样:

function set_widgets(){
    if($scope.widgets !== undefined){
        delete $scope.widgets;
    }
    $scope.widgets         = [];
    for (let i = 0; i < rqData.data.data.widgets.length; i++) {
        const widget = rqData.data.data.widgets[i];
        $ocLazyLoad.load('app/' + widget.type + '/module.js');
        $scope.widgets.push({
                                directive   : widget.type + '-widget',
                                module      : 'app/' + widget.type + '/module.js',
                                view        : 'app/' + widget.type + '/view.html',
                                data        : Object.assign(widget.widget_id,
                                                            {item_id : widget.id, content : widget.content}),
                            });
    }
}
函数集_widgets(){
如果($scope.widgets!==未定义){
删除$scope.widgets;
}
$scope.widgets=[];
for(设i=0;i
编辑:
widgets控制器中的所有$interval和$timeout都需要自己停止,这不是绑定到控制器作用域的内容

在函数中将变量再次设置为空数组之前,我已经添加了
delete$scope.widgets
,但是这似乎不起作用。以前创建的(更新之前)小部件的控制器仍然使用自己的id响应ping广播。在停止超时的每个模块中,我都有一个
$scope.$on('$destroy')
调用,但是这些模块从未被调用。我已经将仪表板控制器设置为发送一个广播事件,立即触发销毁事件。这确实解决了问题,但是旧的实例仍然存在于内存中(通过让每个控制器实例响应“ping”来测试这一点)用他们自己的
$scope.$id
进行广播。不确定是谁对此进行了投票…添加了3行实际上什么也做不了。我建议您创建一个小例子来解决您的问题。首先,如果您删除了惰性负载等,看看问题是否存在。像您在这里发布的那样添加akward代码不会让您走到任何地方。
function set_widgets(){
    if($scope.widgets !== undefined){
        delete $scope.widgets;
    }
    $scope.widgets         = [];
    for (let i = 0; i < rqData.data.data.widgets.length; i++) {
        const widget = rqData.data.data.widgets[i];
        $ocLazyLoad.load('app/' + widget.type + '/module.js');
        $scope.widgets.push({
                                directive   : widget.type + '-widget',
                                module      : 'app/' + widget.type + '/module.js',
                                view        : 'app/' + widget.type + '/view.html',
                                data        : Object.assign(widget.widget_id,
                                                            {item_id : widget.id, content : widget.content}),
                            });
    }
}