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.
Nowadays we can use _.debounce or _.throttle.
So you, debounce the button press to ensure that it only causes one edge or press to propagate to the rest of the circuit.