#angularjs
#angularjs
Вопрос:
Я создал несколько флажков с именем динамической модели следующим образом:
<label ng-repeat="item in main.itemDetails">
<input type="checkbox" checklist-value="item.price"
ng-click="itemChanged(item)" ng-model="checkboxes[item.name]">
{{item.name}} - <b>{{item.price}} €</b>
<br>
</label>
В моем контроллере я хочу установить некоторые флажки, существует ли имя их модели в массиве $ scope.SelectedItems.
Я пытаюсь сделать что-то подобное, но это не работает:
for (var i = 0, j = $scope.selectedItems.length; i<j; i ) {
$scope['selectedItems[i].name'].isChecked = true;
}
например, если item.name = ‘Item1’ Я хочу, чтобы модель называлась $scope.Item1 и позже я хочу вызвать $scope.Item1.isChecked = true;
Что я здесь делаю не так?
Комментарии:
1. попробуйте $scope[$scope.SelectedItems[i][‘name’]]
Ответ №1:
Вы храните модель в $scope.checkboxes
, поэтому вы можете установить ее значение на true
, как показано в приведенном ниже коде.
for (var i = 0, j = $scope.selectedItems.length; i<j; i ) {
$scope.checkboxes[$scope.selectedItems[i].name] = true;
}
Комментарии:
1. для этого нужен «IsChecked», как ответ @Jackthomson
2. @JoaozitoPolo Я знаю, но реальная модель такова
ng-model="checkboxes[item.name]"
, что одну из них нужно изменить.3. @LenilsondeCastro что я должен изменить? Что-то в моем html?
4. @LenilsondeCastro это работает без изменений в моем html. Но, честно говоря, я не совсем понимаю, как это работает… Не могли бы вы это немного объяснить? Что меня смущает, так это то, что если я console.log $scope.checkboxes, я всегда получаю пустой массив
5. @papakias Ну, «массив» флажков привязывается из вашей директивы ngModel, как только вы объявите его из представления, это отразится на вашем
$scope
. Кроме того, вы должны следить за$scope.checkboxes
поскольку это не происходит при инициализации контроллера, вы можете попробовать записать свой флажок, например, в html<p>{{ checkboxes }}</p>
и вы сможете увидеть, что там.
Ответ №2:
Похоже, что вы используете здесь строковый литерал:
for (var i = 0, j = $scope.selectedItems.length; i<j; i ) {
$scope['selectedItems[i].name'].isChecked = true;
}
Просто измените это на чтение:
for (var i = 0, j = $scope.selectedItems.length; i<j; i ) {
$scope[selectedItems[i].name].isChecked = true;
}
Ответ №3:
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.main = [{
'name':'test1',
'price':'23',
'isChecked':false
},
{
'name':'test2',
'price': '25',
'isChecked':false
},
{
'name':'test3',
'price': '21',
'isChecked':false
}];
$scope.selectedItems = [{
'name':'test1'
},
{
'name':'test2'
}];
angular.forEach($scope.main, function(valueMain){
angular.forEach($scope.selectedItems,function(valueSelected){
if(valueMain.name=== valueSelected.name){
valueMain.isChecked = true;
}
})
});
$scope.toggleCheck = function(item){
if(item.isChecked === true){
item.isChecked === false;
}else{
item.isChecked === true;
};
}
}
<script src="https://code.angularjs.org/angular-1.0.1.js"></script>
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<label ng-repeat="item in main">
<input type="checkbox" ng-model="item.isChecked" ng-checked="item.isChecked" ng-change="toggleCheck(item)">
{{item.name}} - <b>{{item.price}} €</b>
<br>
</label>
</div>
</div>
Angular Foreach — самый простой способ решить проблему такого рода.
Комментарии:
1. Вау… это кажется действительно хорошим, я попробую это и оставлю вам отзыв!
2. Похоже, с этим кодом возникает проблема, если я выбираю test1 и test3, но не test2
3. Да, вы правы. Я исправил эту проблему. ng-model должно иметь значение checked или нет, и для проверки изменения требуется ng-change.