Often times the choice between both directives seems trivial, because you can achieve the same effect either way. However both have interesting default behaviours that you can use to you advantage.
ng-show
will hide the element it is on by default, unless the condition in it evaluates to true.ng-hide
will show the element it is on by default, unless the condition in it evaluates to true.
This is most useful when your controller is doing AJAX calls or something else that's asynchronous. Your variables may still be undefined until the AJAX call returns.
foo.controller.js
$ctrl.foos;