Étant donné l'élément select suivant
<select ng-options="size.code as size.name for size in sizes "
ng-model="item.size.code"
ng-change="update(MAGIC_THING)">
</select>
Existe-t-il un moyen de faire en sorte que MAGIC_THING soit égal à la taille actuellement sélectionnée, afin que je puisse accéder à size.name
et size.code
dans mon contrôleur?
size.code affecte beaucoup d'autres parties de l'application (URL de l'image, etc.), mais lorsque le modèle ng de item.size.code
est mis à jour, item.size.name
doit également être mis à jour pour l'utilisateur. Je suppose que la bonne façon de procéder consiste à capturer l'événement de modification et à définir les valeurs à l'intérieur de mon contrôleur, mais je ne suis pas sûr de ce que je peux passer à la mise à jour pour obtenir les valeurs appropriées.
Si c'est totalement la mauvaise façon de s'y prendre, j'aimerais bien savoir la bonne façon.
Au lieu de définir ng-model sur item.size.code, pourquoi ne pas définir la taille:
<select ng-options="size as size.name for size in sizes"
ng-model="item" ng-change="update()"></select>
Ensuite, dans votre méthode update()
, $scope.item
sera défini sur l'élément actuellement sélectionné.
Et quel que soit le code nécessaire, item.size.code
, vous pouvez obtenir cette propriété via $scope.item.code
.
Fiddle .
Update basé sur plus d'informations dans les commentaires:
Utilisez une autre propriété $ scope pour votre modèle sélectionné, puis:
<select ng-options="size as size.name for size in sizes"
ng-model="selectedItem" ng-change="update()"></select>
Manette:
$scope.update = function() {
$scope.item.size.code = $scope.selectedItem.code
// use $scope.selectedItem.code and $scope.selectedItem.name here
// for other stuff ...
}
Vous pouvez également obtenir directement la valeur sélectionnée à l'aide du code suivant
<select ng-options='t.name for t in templates'
ng-change='selectedTemplate(t.url)'></select>
script.js
$scope.selectedTemplate = function(pTemplate) {
//Your logic
alert('Template Url is : '+pTemplate);
}
vous pouvez aussi essayer ceci:
<select ng-model="selectedItem" ng-change="update()">
<option ng-repeat="item in items" ng-selected="selectedItem == item.Id" value="{{item.Id}}">{{item.Name}}</option>
</select>
Si la réponse de Divyesh Rupawala ne fonctionne pas (en passant l'élément en tant que paramètre), veuillez consulter la fonction onChanged()
dans ce Plunker. Il utilise this
:
<select ng-model="item.size.code">
<option ng-repeat="size in sizes" ng-attr-value="size.code">{{size.name}} </option>
</select>
//Javascript
$scope.update = function () {
$scope.myItem;
alert('Hello');
}
<!--HTML-->
<div class="form-group">
<select name="name"
id="id"
ng-model="myItem"
ng-options="size as size.name for size in sizes"
class="form-control"
ng-change="update()"
multiple
required>
</select>
</div>
Si vous voulez écrire, nom, id, classe, plusieurs, requis, vous pouvez écrire de cette manière.
Filtre AngularJS travaillé pour moi.
En supposant que code/id
est unique, nous pouvons filtrer cet objet particulier avec la variable filter
d'AngularJS et utiliser les propriétés des objets sélectionnés. Considérant l'exemple ci-dessus:
<select ng-options="size.code as size.name for size in sizes"
ng-model="item.size.code"
ng-change="update(MAGIC_THING); search.code = item.size.code">
</select>
<!-- OUTSIDE THE SELECT BOX -->
<h1 ng-repeat="size in sizes | filter:search:true"
ng-init="search.code = item.size.code">
{{size.name}}
</h1>
Maintenant, il y a 3 aspects importants à cela :
ng-init="search.code = item.size.code"
- lors de l'initialisation de l'élément h1
en dehors de la case select
, définissez la requête de filtre sur l'option selected.
ng-change="update(MAGIC_THING); search.code = item.size.code"
- lorsque vous modifiez l'entrée de sélection, nous allons exécuter une ligne supplémentaire qui définira la requête "recherche" sur le item.size.code
actuellement sélectionné.
filter:search:true
- Passez true
au filtre pour activer la correspondance stricte.
C'est tout. Si le size.code
est uniqueID, nous n'aurons qu'un seul élément h1
avec le texte size.name
.
J'ai testé cela dans mon projet et ça marche.
Bonne chance
Cela pourrait vous donner quelques idées
Modèle de vue .NET C #
public class DepartmentViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
Contrôleur Api Web .NET C #
public class DepartmentController : BaseApiController
{
[HttpGet]
public HttpResponseMessage Get()
{
var sms = Ctx.Departments;
var vms = new List<DepartmentViewModel>();
foreach (var sm in sms)
{
var vm = new DepartmentViewModel()
{
Id = sm.Id,
Name = sm.DepartmentName
};
vms.Add(vm);
}
return Request.CreateResponse(HttpStatusCode.OK, vms);
}
}
Contrôleur angulaire:
$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.");
}
);
Gabarit angulaire:
<div class="form-group">
<label>Department</label>
<div class="left-inner-addon">
<i class="glyphicon glyphicon-hand-up"></i>
<select ng-model="travelerDepartment"
ng-options="department.Name for department in departments track by department.Id"
ng-init="request.TravelerDepartmentId = travelerDepartment.Id"
ng-change="request.TravelerDepartmentId = travelerDepartment.Id"
class="form-control">
<option value=""></option>
</select>
</div>
</div>
Vous devez utiliser "suivi par" pour que les objets puissent être comparés correctement. Sinon, Angular utilisera la méthode native de comparaison d’objets en js.
Ainsi, votre exemple de code deviendrait -
<select ng-options="size.code as size.name
for size in sizes track by size.code"
ng-model="item.size.code"></select>
C’est le moyen le plus simple d’obtenir une valeur à partir d’une liste d’options de sélection angulaire (autre que l’Id ou le texte) . En supposant que vous ayez un produit de sélection comme celui-ci sur votre page:
<select ng-model="data.ProductId"
ng-options="product.Id as product.Name for product in productsList"
ng-change="onSelectChange()">
</select>
Ensuite, dans Votre contrôleur, définissez la fonction de rappel comme suit:
$scope.onSelectChange = function () {
var filteredData = $scope.productsList.filter(function (response) {
return response.Id === $scope.data.ProductId;
})
console.log(filteredData[0].ProductColor);
}
Explication simple: L'événement ng-change ne reconnaissant pas les éléments d'option de la sélection, nous utilisons le modèle ngModel pour filtrer l'élément sélectionné dans la liste d'options chargée dans le contrôleur.
De plus, étant donné que l'événement est déclenché avant que le ngModel ne soit réellement mis à jour, vous pourriez obtenir des résultats indésirables. Un meilleur moyen serait donc d'ajouter un délai d'attente:
$scope.onSelectChange = function () {
$timeout(function () {
var filteredData = $scope.productsList.filter(function (response) {
return response.Id === $scope.data.ProductId;
})
console.log(filteredData[0].ProductColor);
}, 100);
};