Delaying the $digest() cycle in AngularJS
aaron-gray.com
aaron-gray.com
Debouncing controls one of the terms - frequency of digest cycles - so the complexity grows somewhere between linear and quadratic. The only scalable solution is to minimize the use of watches. Fortunately, this is also a good idea from a code quality standpoint - watches are an unstructured control flow system, similar to GOTO, and should be avoided even if they were efficient.
Any callback is a GOTO. in fact, any function call in C like languages IS A GOTO.
So i'm not sure what is the point of saying that.
$scope.$watch is at the center of angularjs architecture,there is no way to avoid it.
And that's what makes angularJS awesome,seamless integration between the view layer and other app layers,without a single explicit event handler registration,mediator,observer,... (except for directives obviously). No JS framework but angularjs does that,not even React that needs a 3rd party library to integrate itself with a domain layer.
That's why angularjs is so easy to use and beats everything else.
If a function call would be a GOTO, then you wouldn't have a stack trace to look at in your debugger.
I'm not sure what is the point in replying to a comment you don't actually understand.
Angular's data binding model has a lot of shortcomings:
angular.module("app").controller("SomeController", function($scope) {
setTimeout(function () {
$scope.someVar = 'happy debugging';
}, 500);
}); angular.module("app").controller("SomeController", function($scope) {
setTimeout(function () {
$scope.someVar = 'happy debugging';
}, 500);
});
Your example is stupid1/ you should use $timeout or you're just asking for troubles.If not then $scope.$apply
2/ use named function expressions
Any async operation in angularjs needs to trigger a digest cycle,that's angular 101. You cant use a framework without actually understanding how it works at first place.
Your point is moot because you are using an example that is a mistake at best , but more like a bad piece of code,in angularjs context.No serious angularjs developper would do that mistake,especially when you are supposed to test that piece of code,using a function you didnt inject in the controller.
Another performance trick.
If you use ng-hide/show to hide a long list, then make a dummy function that takes the list and the variable for the ng-hide/show and only returns the list when the ng-show is true. This way you don't spend valuable time rendering something that will have css hidden.
For example if you have a list of objects where some particular action might apply only to a portion of them.
So you, debounce the button press to ensure that it only causes one edge or press to propagate to the rest of the circuit.
Nowadays we can use _.debounce or _.throttle.