AngularJS inconsistent databinding

I'm learning AngularJS and I have a question regarding the databinding for select elements. The databinding for textboxes works without any kind of event handling code. Once the ng-model attribute is set textbox updates when the model property changes and vice versa. There is no need for ng-change attribute.

However, for select elements we need to write functions that will be called via ng-change atribute.

Why does angularjs handle databinding without an ng-change attribute for textboxes but requires functions that will be called via ng-change attribute for select elements?

UPDATE: Added the fiddle in the comments section. The example is from AngularJS in Action book. Click on one of the stories, change the textbox value and the model is updated. Change the selection in dropdown model is not updated.

UPDATE: Added a new fiddle in the comments.

Thanks.

I think your confusion might be a result of the select documentation still being incorrect. (See my Disqus comment.) ng-model can and should be used with select. ng-change is optional and it just gives you a hook should you want to do something each time the selected option changes.

Normally you should use ng-options with select.

I've created a fiddle that works here - The issue is really just the dummy data here. In the original fiddle, the object created in the statuses array for {name:'Back Log'} and {name:'To Do'} are not the same (not ===) as the {name:'Back Log'} and {name:'To Do'} objects created in the dummy story objects.

To make the example work, I pass the indexed statuses into the getStories function. However I think this is really just a case of demo-induced confusion. (I've been looking at the MEAP for Angular in Action as well, and I think it could be simplified a bit like this one, that uses simple string statuses that will pass the === test

var getStories = function(statusesIndex) {
    var tempArray = [
        {title:'Story 00',
         description:'Description pending.',
        status: statusesIndex['To Do']
        },
        {title:'Story 01',
         description:'Description pending.',
         status: statusesIndex['Back Log']
        }
];
    return tempArray;
}

If i understood your question correctly then I think your guessing is wrong because for select boxes, you do not have to invoke ng-change event in order to fetch the selected option.

<select ng-model='select'>
  <option>....</option>
  <option value='one'>One</option>
  <option value='Two'>Two</option>
</select>

// Your selected option will print below... without invoking ng-change
<div>You selected: {{select}}</div>

Demo: http://jsfiddle.net/jenxu/1/