Het NG-object krijgen dat is geselecteerd met NG-Change

Gezien het volgende select element

<select ng-options="size.code as size.name for size in sizes " 
        ng-model="item.size.code" 
        ng-change="update(MAGIC_THING)">
</select>

Is er een manier om Magic_thing te krijgen om gelijk te zijn aan de momenteel geselecteerde grootte, dus ik heb toegang tot size.nameen size.codein mijn controller?

Grootte.code beïnvloedt veel van de andere delen van de app (beeld-URL’s, enz.), maar wanneer het NG-model van item.size.codeis bijgewerkt, item.size.namemoet ook worden bijgewerkt voor het gebruik van dingen. Ik neem aan dat de juiste manier om dit te doen, de verandering gebeurtenis vastlegt en de waarden in de binnenkant van mijn controller instelt, maar ik weet niet zeker wat ik in update kan doorgeven om de juiste waarden te krijgen.

Als dit helemaal de verkeerde manier is om erover te gaan, zou ik graag de juiste manier willen weten.


Antwoord 1, Autoriteit 100%

In plaats van het NG-model in te stellen op item.size.code, hoe zit het met het instellen van het op maat:

<select ng-options="size as size.name for size in sizes" 
   ng-model="item" ng-change="update()"></select>

Dan in uw update()methode, $scope.itemwordt ingesteld op het momenteel geselecteerde item.

en welke code dan ook item.size.code, kan die woning via $scope.item.codekrijgen.

Fiddle .

Update Op basis van meer informatie in opmerkingen:

Gebruik een andere eigenschap $ scope voor uw Select NG-model dan:

<select ng-options="size as size.name for size in sizes" 
   ng-model="selectedItem" ng-change="update()"></select>

Controller:

$scope.update = function() {
   $scope.item.size.code = $scope.selectedItem.code
   // use $scope.selectedItem.code and $scope.selectedItem.name here
   // for other stuff ...
}

Antwoord 2, Autoriteit 10%

U kunt ook direct geselecteerde waarde krijgen met behulp van de volgende code

<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);
}

Antwoord 3, Autoriteit 3%

U kunt dit ook proberen:

<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>

Antwoord 4, Autoriteit 2%

Als het antwoord van Divyesh Rupawala niet werkt (het huidige item als parameter passeren), zie dan de onChanged()Functie in deze PLUNKER. Het gebruikt this:

http://plnkr.co/edit/b5tdqj


Antwoord 5

<select ng-model="item.size.code">
<option ng-repeat="size in sizes" ng-attr-value="size.code">{{size.name}}          </option>
</select>

Antwoord 6

//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>

Snippet uitvouwen


Antwoord 7

Dit geeft je misschien wat ideeën

.NET C# Model bekijken

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<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);
    }
}

Hoekcontroller:

$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.");
    }
);

Hoekige sjabloon:

<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>

Antwoord 8

Je moet “track by” gebruiken om de objecten correct te kunnen vergelijken. Anders gebruikt Angular de native js-manier om objecten te vergelijken.

Dus je voorbeeldcode zou veranderen in –

   <select ng-options="size.code as size.name
 for size in sizes track by size.code" 
ng-model="item.size.code"></select>

Antwoord 9

Het filter van AngularJSwerkte voor mij.

Ervan uitgaande dat de code/iduniekis, kunnen we dat specifieke object uitfilteren met het filtervan AngularJS en werken met de geselecteerde objecteigenschappen. Gezien het bovenstaande voorbeeld:

<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>

Nu zijn er 3 belangrijke aspecten:

  1. ng-init="search.code = item.size.code"– bij het initialiseren van het h1-element buiten het vak select, stel de filterquery in op de geselecteerde optie.

  2. ng-change="update(MAGIC_THING); search.code = item.size.code"– wanneer u de geselecteerde invoer wijzigt, voeren we nog een regel uit die stel de “zoek”-query in op de momenteel geselecteerde item.size.code.

  3. filter:search:true– Geef truedoor om te filteren om strikte matchingin te schakelen.

Dat is het. Als de size.codeuniqueIDis, hebben we slechts één h1-element met de tekst size.name.

Ik heb dit in mijn project getest en het werkt.

Veel succes


Antwoord 10

Dit is de schoonste manier om een ​​waarde te krijgen uit een hoekige keuzelijst (anders dan The Id of Text).
Ervan uitgaande dat u een Product Select zoals dit op uw pagina heeft staan:

<select ng-model="data.ProductId"
        ng-options="product.Id as product.Name for product in productsList"
        ng-change="onSelectChange()">
</select>

Stel vervolgens in Uw controller de callback-functie als volgt in:

   $scope.onSelectChange = function () {
        var filteredData = $scope.productsList.filter(function (response) {
            return response.Id === $scope.data.ProductId;
        })
        console.log(filteredData[0].ProductColor);
    }

Eenvoudig uitgelegd:aangezien de ng-change-gebeurtenis de optie-items in de select niet herkent, gebruiken we het ngModel om het geselecteerde item uit de optielijst die in de controller is geladen te filteren.

Bovendien, aangezien de gebeurtenis wordt geactiveerd voordat het ngModel echt is bijgewerkt, kunt u ongewenste resultaten krijgen, dus een betere manier zou zijn om een ​​time-out toe te voegen:

       $scope.onSelectChange = function () {
            $timeout(function () {
            var filteredData = $scope.productsList.filter(function (response) {
                return response.Id === $scope.data.ProductId;
            })
            console.log(filteredData[0].ProductColor);
            }, 100);
        };

Other episodes