AngularJS ng-disabled directive with expression is not working

The ng-disabled expression is evaluated in the present scope. Hence, you should only need the following without any extra interpolation with {{..}}:

    <input type="submit" 
           value="Register" 
           ng-show="isNewUser" 
           ng-disabled="!hasAcceptedTnC(tnc)">

Note that I added a ! since you probably want the button disabled if the user has not accepted the TnC.

Working demo: http://plnkr.co/edit/95UiO4Rd2IMh8T1KjSQK?p=preview


A comment was posted below asking how to reason about when to use {{...}} and when to use bare expression with a given ng-* directive. Unfortunately, there is no syntactical clue hidden in the directives which can reveal that information. Looking at the documentation will turn out to be fastest way to find out this information.