プリミティブ「アイテム」へのデータバインディングが機能しない理由は、ng-repeatが各アイテムの子スコープを作成する方法のためです。アイテムごとに、ng-repeatは親スコープからプロトタイプ的に継承する新しい子スコープを持ち(下の図の破線を参照)、次にアイテムの値を子スコープの新しいプロパティ(下の図の赤いアイテム)に割り当てます。新しいプロパティの名前は、ループ変数の名前です。ng-repeatソースコードから:
childScope = scope.$new();
...
childScope[valueIdent] = value;
itemがプリミティブの場合、新しい子スコーププロパティには、基本的にプリミティブの値のコピーが割り当てられます。この子スコーププロパティは親スコープには表示されず、入力フィールドに加えた変更はこの子スコーププロパティに保存されます。たとえば、親スコープにあるとします
$scope.list = [ 'value 1', 'value 2', 'value 3' ];
そしてHTMLで:
<div ng-repeat="item in list">
次に、最初の子スコープはitem
、プリミティブ値(value 1
)を持つ次のプロパティを持ちます。
item: "value 1"

ng-modelデータバインディングにより、フォームの入力フィールドに加えた変更は、その子スコーププロパティに保存されます。
これは、子スコープをコンソールに記録することで確認できます。ng-repeat内のHTMLに追加します。
<a ng-click="showScope($event)">show scope</a>
コントローラに追加します:
$scope.showScope = function(e) {
console.log(angular.element(e.srcElement).scope());
}
@Gloopyのアプローチでは、各子スコープは引き続き新しい「item」プロパティを取得しますが、listはオブジェクトの配列になっているため
childScope[valueIdent] = value;
、itemプロパティの値は配列オブジェクトの1つ(コピーではない)への参照に設定されます。

showScope()手法を使用すると、子スコープitem
プロパティの値が配列オブジェクトの1つを参照していることがわかります。これは、プリミティブ値ではなくなりました。
ng-repeat子スコープのプリミティブにバインドしないおよび
AngularJSのスコープのプロトタイプ/プロトタイプ継承のニュアンスは何ですか?も参照してください。(これには、ng-repeatを使用した場合のスコープの外観の写真が含まれています)。