相关疑难解决方法(0)

AngularJS中控制器之间通信的正确方法是什么?

控制器之间通信的正确方法是什么?

我目前正在使用一种可怕的软糖包括window:

function StockSubgroupCtrl($scope, $http) {
    $scope.subgroups = [];
    $scope.handleSubgroupsLoaded = function(data, status) {
        $scope.subgroups = data;
    }
    $scope.fetch = function(prod_grp) {
        $http.get('/api/stock/groups/' + prod_grp + '/subgroups/').success($scope.handleSubgroupsLoaded);
    }
    window.fetchStockSubgroups = $scope.fetch;
}

function StockGroupCtrl($scope, $http) {
    ...
    $scope.select = function(prod_grp) {
        $scope.selectedGroup = prod_grp;
        window.fetchStockSubgroups(prod_grp);
    }
}
Run Code Online (Sandbox Code Playgroud)

scope angularjs

470
推荐指数
9
解决办法
21万
查看次数

当范围被破坏时,是否应该删除angular $ watch?

目前正在开展一个项目,当我们发现大量内存泄漏时,不清除已销毁范围内的广播订阅.以下代码修复了此问题:

var onFooEventBroadcast = $rootScope.$on('fooEvent', doSomething);

scope.$on('$destroy', function() {
    //remove the broadcast subscription when scope is destroyed
    onFooEventBroadcast();
});
Run Code Online (Sandbox Code Playgroud)

这种做法是否也应该用于手表?代码示例如下:

var onFooChanged = scope.$watch('foo', doSomething);

scope.$on('$destroy', function() {
    //stop watching when scope is destroyed
    onFooChanged();
});
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angularjs-directive angularjs-scope

53
推荐指数
1
解决办法
3万
查看次数

如何在指令中安全地清理AngularJS事件绑定

我有一个Angular指令,它将元素的高度设置为等于浏览器窗口的内部高度(+/-给定的偏移量).该指令响应窗口的"resize"事件并相应地调整其高度.当我的指令范围发出'$ destory'事件时,我删除了对"resize"事件的绑定(我认为保留它会导致一些问题,如果我错了就纠正我).

我不知道如何以"安全"的方式做这个事件分离.如果我在我的应用程序中有多个此指令实例,如果我有其他指令附加到'resize'事件怎么办?

JQuery具有事件命名空间的概念,这似乎是一个很好的解决方案,但Angular的实现(JQLite)不支持这一点.因为我已经在使用Angular,所以我宁愿不使用JQuery,所以我该怎么办?

这是我今天指令的代码

window.angular.module('arcFillClient', [])
    .directive('arcFillClientY', ['$window',
        function ($window) {

            function link($scope, el, attrs) {

                var setHeight,
                    onResize,
                    cleanUp;

                setHeight = function (offSetY) {
                    var newHeight;
                    offSetY = offSetY || 0;
                    newHeight = Math.max($window.innerHeight + parseInt(offSetY, 10)) + 'px';
                    el.height(newHeight);
                };

                onResize = function () {
                    var offset;
                    offset = attrs.arcFillClientY || 0;
                    setHeight(offset);
                };

                attrs.$observe('arcFillClientY', setHeight);
                window.angular.element($window).on('resize', onResize);

                cleanUp = function () {
                    window.angular.element($window).off('resize');
                };

                $scope.$on('$destroy', cleanUp);
            }
            return {
                link: link
            };
Run Code Online (Sandbox Code Playgroud)

更新看起来像RTFM的情况,但万一其他人徘徊在这里,这里有一些更多的信息.将原始函数(在我的情况下 …

javascript angularjs

24
推荐指数
2
解决办法
2万
查看次数

当角度开始破坏时,我们是否需要在指令中取消绑定事件监听器?

我的应用程序中存在大量内存泄漏但我没有找到原因,这是后台.

  • 我正在使用AngularJS + JQuery(插件)
  • 许多听众受到如下约束:

    $(element).on("keyup",function(){});

所以问题是

我是否需要通过以下方式取消绑定指令中的听众?

scope.$on("$destroy", function() {
    $(element).off();
}); 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你如何找到Web应用程序中的内存泄漏?我使用chrome的配置文件(请参阅此处分析内存性能),但我无法跟踪内存泄漏的代码.你有什么建议吗?

非常感谢!

jquery memory-leaks event-listener angularjs

21
推荐指数
1
解决办法
1万
查看次数

AngularJS:在输入中如何在没有聚焦时显示'$ 50,000.00'但在聚焦时显示'50000'?

我有一个输入来显示格式化的数字.通常,当它没有焦点时,它应该显示一个格式化的字符串,例如'$ 50,000.00'.但是当它具有焦点时,它应该显示原始值,例如50000用于编辑.

有内置功能吗?谢谢!

angularjs

13
推荐指数
2
解决办法
3950
查看次数

角Js应用中的内存问题

我在角js应用程序中面临内存泄漏问题.我已经尝试了所有可能的解决方案,如配置文件工具,时间轴和一些与角度js相关的其他工具.我的工作到现在为止 -

配置工具

在配置文件工具中,JS堆不断增加,但无法找到它的原因. 分离的dom元素继续增加

时间线

它表明存在内存泄漏的可能性,但我仍然不知道如何调试和修复它.

在此输入图像描述

任务管理器

它继续增加内存大小.有时它收集垃圾但不显着. 在此输入图像描述

请告诉我如何调试并找出可能存在的问题.如果您遇到同样的问题,请分享您的经验.

javascript performance memory-leaks angularjs

10
推荐指数
1
解决办法
565
查看次数

当$ destroy激活时,是否需要在指令上删除事件处理程序?

我已经看过很多指令性的例子,包括AngularUI团队的那些,他们似乎没有进行任何清理.

这是他们创建jQuery datepicker的ui-date指令的一个例子. (资源)

element.on('blur', function() { ... });
Run Code Online (Sandbox Code Playgroud)

他们在元素上放置了一个事件处理程序,但它们从来没有取消绑定事件.我原以为会有代码存在,例如:

var namespace = ".uiDate";

element.on('blur' + namespace, function() { ... });
element.on("$destroy" + namespace, function ()
{
   element.datepicker("destroy");      //Destroy datepicker widget
   element.off(namespace);             //Unbind events from this namespace
});
Run Code Online (Sandbox Code Playgroud)

所以这让我想知道是否有一些我不理解的东西.在创建和销毁元素w/this指令的情况下,它们不会导致内存泄漏吗?

我错过了什么?

jquery jquery-ui angularjs angular-ui angularjs-directive

7
推荐指数
1
解决办法
3042
查看次数

如何清理从控制器分配的事件?

控制器不再相关,何时,何地以及如何摆脱旧的事件监听器?

考虑SPA有两条路线:/login/loggedin

app.factory('socket', ['$window', function(window) {
    return window.io();
}]);
app.controller('loginController', ['socket', function (socket) {
    this.tryLogin = function(credentials) {
        socket.emit('login', credentials);
    }
    sokcet.on('loginResponse', function(data) {
        if (data.status == 'OK') {
            // Navigate to loggedInController
        } else {
            // Show error message and keep listening - user might try again
        }
    });
}]);
app.controller('loggedInController', ['socket', function (socket) {/* Logged in, but loginController is still listening for loginResponse */}]); …
Run Code Online (Sandbox Code Playgroud)

javascript events socket.io angularjs angularjs-controller

6
推荐指数
1
解决办法
116
查看次数

检测是否从DOM中删除了指令

我有一个AngularJS指令,如果指令的元素从DOM中删除(从AngularJS调用内部或通过任何其他方法,如jQuery),我需要执行某些操作.

那可能吗?

javascript dom angularjs angularjs-directive

1
推荐指数
1
解决办法
1448
查看次数