控制器之间通信的正确方法是什么?
我目前正在使用一种可怕的软糖包括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) 目前正在开展一个项目,当我们发现大量内存泄漏时,不清除已销毁范围内的广播订阅.以下代码修复了此问题:
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) 我有一个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的情况,但万一其他人徘徊在这里,这里有一些更多的信息.将原始函数(在我的情况下 …
我的应用程序中存在大量内存泄漏但我没有找到原因,这是后台.
许多听众受到如下约束:
$(element).on("keyup",function(){});
所以问题是
我是否需要通过以下方式取消绑定指令中的听众?
scope.$on("$destroy", function() {
$(element).off();
});
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你如何找到Web应用程序中的内存泄漏?我使用chrome的配置文件(请参阅此处分析内存性能),但我无法跟踪内存泄漏的代码.你有什么建议吗?
非常感谢!
我有一个输入来显示格式化的数字.通常,当它没有焦点时,它应该显示一个格式化的字符串,例如'$ 50,000.00'.但是当它具有焦点时,它应该显示原始值,例如50000用于编辑.
有内置功能吗?谢谢!
我在角js应用程序中面临内存泄漏问题.我已经尝试了所有可能的解决方案,如配置文件工具,时间轴和一些与角度js相关的其他工具.我的工作到现在为止 -
配置工具
时间线
它表明存在内存泄漏的可能性,但我仍然不知道如何调试和修复它.
任务管理器
请告诉我如何调试并找出可能存在的问题.如果您遇到同样的问题,请分享您的经验.
我已经看过很多指令性的例子,包括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指令的情况下,它们不会导致内存泄漏吗?
我错过了什么?
当控制器不再相关时,何时,何地以及如何摆脱旧的事件监听器?
考虑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) 我有一个AngularJS指令,如果指令的元素从DOM中删除(从AngularJS调用内部或通过任何其他方法,如jQuery),我需要执行某些操作.
那可能吗?
angularjs ×9
javascript ×5
jquery ×2
memory-leaks ×2
angular-ui ×1
dom ×1
events ×1
jquery-ui ×1
performance ×1
scope ×1
socket.io ×1