AngularJS Material - ng-checked на md-radio-button с ng-value в качестве объекта

Я огляделся, чтобы увидеть, ответил ли кто-нибудь на это, но, похоже, нет. Я хочу использовать объект, а не строку или целое число в качестве значения переключателя. Это возможно? Не похоже, потому что у меня проблемы с тегами md-radio-button, распознающими выбранный объект, а не строковое или целочисленное значение. Я вижу, что он работает после загрузки страницы, и я что-то выбираю, но не знаю, как проверить переключатель, если значение уже существует. Здесь вы можете увидеть очень простую демонстрацию: https://codepen.io/anon/pen/ZmjrLN

Я пробовал class = "md-checked", чтобы увидеть, работает ли это, но это не так. Пробовал ng-checked = "selectedStatus.Name == status.Name", тоже не работает. По сути ng-checked = "true" тоже не работает.

Я бы подумал, что md-radio-button может работать с объектом!

--- РЕДАКТИРОВАТЬ ДЛЯ УТОЧНЕНИЯ ---

Из ответа ниже, ссылаясь на код из codepen, если я использую тот же объект в $scope.statuses для заполнения $scope.selectedStatus, он действительно выбирает правильный переключатель при загрузке. ОДНАКО в реальном мире $scope.selectedStatus заполняется фактическим статусом с сервера, а $scope.statuses также заполняется из того же вызова. Это одинаковые, но 2 разных объекта.

Короче говоря, я все же хочу отметить правильный, даже если объекты не совсем одинаковые, с ними следует обращаться как с ними, потому что они одинаковы.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
358
1

Ответы 1

При сравнении объектов ng-checked проверяет, является ли отмеченный тем же объектом или ссылкой, и не проверяет соответствие объекта. Таким образом, чтобы установить выбранную / отмеченную радиокнопку, сделайте так, чтобы значение относилось к объекту. Вот пример обновлений Javascript для вашего кода:

angular
  .module('BlankApp')
  .controller('AppController', function($scope) {
    $scope.statuses = [
      {id: 1, Name: 'Active'}, 
      {id: 2, Name: 'Dormant'}
    ];
    $scope.selectedStatus = $scope.statuses[0]; // reference the object directly
  });

Или, если значение установлено вне области видимости, и мы должны сравнить, тогда мы можем сравнить вручную, а затем установить selectedStatus, найдя правильный объект и назначив его.

angular
.module('BlankApp')
.controller('AppController', function($scope) {
  $scope.statuses = [
    {id: 1, Name: 'Active'}, 
    {id: 2, Name: 'Dormant'}
  ];
  $scope.selectedStatus = {id: 1, Name: 'Active'};

  // Find the index of the selected that matches on id
  let i = $scope.statuses.findIndex((val) => {
    return val.id = $scope.selectedStatus.id;
  }); 

  $scope.selectedStatus = $scope.statuses[i]
});

Это действительно работает. ОДНАКО переменная selectedStatus заполняется объектом с сервера. По сути, scope.statuses фактически находится в компоненте, который разрешается при вызове состояния, и это состояние заполняется вызовом из базы данных. selectedStatus заполняется статусом из того же вызова разрешения. Вы понимаете, о чем я? Это тот же объект, но он исходит от сервера. Думаю, я мог бы сделать что-нибудь в функции $onInit, чтобы проверить, заполняется ли статус, и использовать идентификатор, чтобы повторно заполнить его переменной из списка, но это кажется излишним

Paul Carlton 27.11.2018 17:11

Посмотрите, подойдут ли вам указанные выше правки. Хм, учитывая то, что вы сказали, вы должны поместить все это в блок $ watch или что-то подобное.

Matthew Wilson 27.11.2018 19:20

Другие вопросы по теме