オブジェクト配列の各オブジェクトの特定の属性をリッスンし、変更属性に従ってオブジェクト内の別の属性値を変更します。私はAngular materialのmd-selectを使って属性値を変更しています。これまで私は以下のように試みました。しかし、それは動作していません。どこが間違っていたのですか?助けてください。トリックを見つめているオブジェクト配列内の各オブジェクトの特定の属性を見る - 角形
$scope.$watch('items', function(newValues, oldValues) {
for (var i = 0; i < newValues.length; i++) {
if (newValues[i].textMode.id === 1) {
newValues[i].text = "word";
} else if (newValues[i].textMode.id === 2) {
newValues[i].text = "phrase";
} else if (newValues[i].textMode.id === 3) {
newValues[i].text = "paragraph";
}
}
}, true);
:
app.js
var app = angular.module('app', ['ngAria', 'ngAnimate','ngMaterial']);
app.controller('appController', function ($scope) {
$scope.modes = [{id: 1}, {id: 2}, {id: 3}];
$scope.items = [
{id: "1", text: "word", textMode: {id: 1}},
{id: "2", text: "word", textMode: {id: 1}},
{id: "3", text: "word", textMode: {id: 1}}
];
angular.forEach($scope.items, function(item) {
$scope.$watch('item.textMode.id', function() {
if (item.textMode.id === 1) {
item.text = "word";
} else if (item.textMode.id === 2) {
item.text = "phrase";
} else if (item.textMode.id === 3) {
item.text = "paragraph";
}
})
});
});
index.htmlを
<div ng-app="app">
<div ng-controller="appController">
<div ng-repeat="item in items">
<md-select aria-label="textChanger" class="selector" ng-model="item.textMode.id" placeholder="Text mode ID">
<md-option ng-repeat="mode in modes" ng-value="mode.id">
{{mode.id}}
</md-option>
</md-select>
<br>
{{item.text}}
<br><br><br>
</div>
</div>
</div>
JsFiddle: https://jsfiddle.net/lpsandaruwan/ho5egr16/
はangular.js実務経験を持っていませんが、時にドロップダウン値の変更あなたの関数がトリガされません – Ionut
$ watchの代わりに$ watchCollectionを使用してください。また、私はあなたのアイテムオブジェクトを簡素化する必要があると思う、いくつかのプロパティは重複しているようです。 –