EDIT:
The question as stated in the title is answered correctly below, so I think in the interest of people seeing how to do this, I should leave the question with the answer below.
It turns out that the framework I'm using has not fully abstracted away the variable-to-camelcase convention of Angular here. It's abstracted away most everywhere else, just not here, and everything works now, so I don't need to force a redraw at all. If anyone does, see the answer below. :)
Do the event binding inside your directive, not inside your controller. You must call $apply() from inside your directive if you make changes to some model and want those changes to be reflected outside the directive:
myApp.directive('someDir', function () {
return {
restrict: 'E',
scope: {
model: '=',
},
link: function (scope, elt, dirs) {
elt.bind('click', function () {
scope.$apply(function () {
// make changes to scope.model
});
});
}
}
});