получение ng-объекта, выбранного с помощью ng-change
Учитывая следующий элемент выбора
Есть ли способ заставить MAGIC_THING быть равным текущему выбранному размеру, поэтому у меня есть доступ к size.name
и size.code
в моем controllerе?
size.code влияет на многие другие части приложения (URL-адреса изображений и т. д.), но когда обновляется ng-модель item.size.code
, item.size.name
необходимо обновить для пользователя, обращенного вещи. Я предполагаю, что правильный способ сделать это – захватить событие изменения и установить значения внутри моего controllerа, но я не уверен, что я могу передать в обновление, чтобы получить правильные значения.
- Могу ли я использовать одно ng-приложение внутри другого в AngularJS
- Смутно о Сервисе и Фабрике
- Нет заголовка «Access-Control-Allow-Origin» присутствует в запрошенном ресурсе - AngularJS
- jQuery и AngularJS: привязать события к изменению DOM
- Как получить предыдущий элемент в ng-repeat?
Если это совершенно неверный путь, я хотел бы знать правильный путь.
- Как настроить routeProvider и locationProvider в angularJS?
- AngularJS $ http-post - преобразовать двоичный файл в excel и загрузить
- Как использовать $ on в сервисе в угловом режиме?
- AngularJS отключает частичное кэширование на dev-машине
- Обеспечение уникальных имен пользователей Firebase simplelogin
- angularjs не может найти каталог шаблонов, колбу в качестве бэкэнд
- Альтернатива ng-show / -hide или как загрузить только соответствующий раздел DOM
- Вложенные ng-repeat
Вместо того, чтобы установить ng-model в item.size.code, как установить его размер:
Затем в вашем методе update()
$scope.item
будет установлено на $scope.item
выбранный элемент.
И любой код, необходимый для item.size.code
, может получить это свойство через $scope.item.code
.
Скрипт .
Обновление, основанное на дополнительной информации в комментариях:
Затем используйте другое свойство $ scope для выбранной ng-модели:
controller:
$scope.update = function() { $scope.item.size.code = $scope.selectedItem.code // use $scope.selectedItem.code and $scope.selectedItem.name here // for other stuff ... }
Вы также можете напрямую получить выбранное значение, используя следующий код
script.js
$scope.selectedTemplate = function(pTemplate) { //Your logic alert('Template Url is : '+pTemplate); }
вы также попробуете это:
Если ответ Divyesh Rupawala не работает (передавая текущий элемент в качестве параметра), то, пожалуйста, см. onChanged()
в этом Plunker. Он использует this
:
//Javascript $scope.update = function () { $scope.myItem; alert('Hello'); }
Это может дать вам некоторые идеи
.NET C # View Model
public class DepartmentViewModel { public int Id { get; set; } public string Name { get; set; } }
.NET C # Web Api Controller
public class DepartmentController : BaseApiController { [HttpGet] public HttpResponseMessage Get() { var sms = Ctx.Departments; var vms = new List(); foreach (var sm in sms) { var vm = new DepartmentViewModel() { Id = sm.Id, Name = sm.DepartmentName }; vms.Add(vm); } return Request.CreateResponse(HttpStatusCode.OK, vms); } }
Угловой controller:
$http.get('/api/department').then( function (response) { $scope.departments = response.data; }, function (response) { toaster.pop('error', "Error", "An unexpected error occurred."); } ); $http.get('/api/getTravelerInformation', { params: { id: $routeParams.userKey } }).then( function (response) { $scope.request = response.data; $scope.travelerDepartment = underscoreService.findWhere($scope.departments, { Id: $scope.request.TravelerDepartmentId }); }, function (response) { toaster.pop('error', "Error", "An unexpected error occurred."); } );
Угловой шаблон:
Фильтр AngularJS создан для меня.
Предполагая, что code/id
уникален , мы можем отфильтровать этот конкретный объект с помощью filter
AngularJS и работать с выбранными объектами. Учитывая приведенный выше пример:
{{size.name}}
Теперь есть три важных аспекта :
-
ng-init="search.code = item.size.code"
– при инициализации элемента внешнего элементаh1
select
запрос фильтра к выбранному параметру . -
ng-change="update(MAGIC_THING); search.code = item.size.code"
– при изменении ввода выбора мы запустим еще одну строку, которая установит запрос поиска к выбранному в данный моментitem.size.code
. -
filter:search:true
– передатьtrue
для фильтрации, чтобы включить строгое сопоставление .
Вот и все. Если size.code
является uniqueID , у нас будет только один элемент h1
с текстом size.name
.
Я тестировал это в своем проекте, и он работает.
Удачи
Вам нужно использовать «track by», чтобы можно было правильно сравнивать объекты. В противном случае Angular будет использовать собственный метод сравнения объектов js.
Таким образом, ваш примерный код изменится на –
Это самый чистый способ получить значение из списка опций углового выбора (кроме Id или Text). Предположим, что у вас есть продукт. Выбирайте вот так на своей странице:
Затем в вашем controllerе задайте функцию обратного вызова следующим образом:
$scope.onSelectChange = function () { var filteredData = $scope.productsList.filter(function (response) { return response.Id === $scope.data.ProductId; }) console.log(filteredData[0].ProductColor); }
Просто объяснение: поскольку событие ng-change не распознает элементы опций в элементе select, мы используем ngModel для фильтрации выбранного элемента из списка параметров, загруженного в controller.
Кроме того, поскольку событие запускается до того, как ngModel действительно обновится, вы можете получить нежелательные результаты. Поэтому лучшим способом было бы добавить тайм-аут:
$scope.onSelectChange = function () { $timeout(function () { var filteredData = $scope.productsList.filter(function (response) { return response.Id === $scope.data.ProductId; }) console.log(filteredData[0].ProductColor); }, 100); };