Es scheint nicht möglich zu sein, den "Wert" einer Auswahl in irgendeiner sinnvollen Weise als normales HTML-Formularelement zu verwenden und ihn auch auf genehmigte Weise mit ng-options an Angular anzuschließen. Als Kompromiss musste ich schließlich eine versteckte Eingabe neben meine Auswahl setzen und sie das gleiche Modell wie meine Auswahl verfolgen lassen (alles aus Gründen der Kürze sehr stark von echtem Produktionscode vereinfacht):
HTML:
<select ng-model="profile" ng-options="o.id as o.name for o in profiles" name="something_i_dont_care_about">
</select>
<input name="profile_id" type="text" style="margin-left:-10000px;" ng-model="profile"/>
Javascript:
App.controller('ConnectCtrl',function ConnectCtrl($scope) {
$scope.profiles = [{id:'xyz', name:'a profile'},{id:'abc', name:'another profile'}];
$scope.profile = -1;
}
Dann habe ich in meinem serverseitigen Code nur gesucht params[:profile_id]
(dies war zufällig eine Rails-App, aber das gleiche Prinzip gilt überall). Da die versteckten Eingaben dasselbe Modell wie die Auswahl verfolgen, bleiben sie automatisch synchron (kein zusätzliches Javascript erforderlich). Dies ist der coole Teil von Angular. Es gleicht fast aus, was es als Nebeneffekt mit dem Wertattribut macht.
Interessanterweise stellte ich fest, dass diese Technik nur mit Eingabe-Tags funktioniert, die nicht ausgeblendet waren (weshalb ich den Rand links verwenden musste: -10000px; Trick, um die Eingabe von der Seite zu verschieben). Diese beiden Varianten haben nicht funktioniert:
<input name="profile_id" type="text" style="display:none;" ng-model="profile"/>
und
<input name="profile_id" type="hidden" ng-model="profile"/>
Ich denke, das muss bedeuten, dass mir etwas fehlt. Es scheint zu seltsam, um ein Problem mit Angular zu sein.