2016-06-27 10 views
0

Ich habe zwei Eingabeoptionen, die über ng-model verknüpft sind, um immer das gleiche Land an beiden Orten anzuzeigen.AngularJS - Ng - Aktualisierungswert ändern, aber Optionsfeld nicht umschalten

<select ng-model="selectedCountry" ng-options="country.name for country in countries"> 
<select ng-model="selectedCountry" ng-options="country.name for country in countries"> 

Jedes Land hat unterschiedlich Versandkosten hat, und sobald das Land Sie auch zwischen verschiedenen Versandoptionen („normal“ und „Express“ mit einer Radio-Button. Ich will es immer mache die Seite "können ausgewählt wählen normale“Kosten, wenn das Land wechselt, und ich habe es durch Zugabe eines ng Klick auf jeden der Eingabemöglichkeiten und das Hinzufügen eine ng-Änderung, um die Änderungen zu hören:

<select ng-model="selectedCountry" ng-options="country.name for country in countries" ng-change="changeShipping()" ng-click="shippingPrice=selectedCountry.shipping.normal"> 

Das Problem ist, dass während Die in der Ansicht angezeigten Daten sind korrekt, wenn das Land gewechselt wird, aber das Optionsfeld ist immer noch auf die falsche Option eingestellt 0 Dies ist meine Controller-Logik:

var app = angular.module('myApp', []); 
app.controller('myCtrl', function($scope) { 
$scope.countries = [{ 
    "name": "Freedonia", 
    "shipping" : 
    { 
     "normal":30, 
     "express":70 
    } 
    },{ 
    "name": "Mordor", 
    "shipping" : 
    { 
     "normal":70, 
     "express":110 
    } 
    },{ 
    "name": "Oz", 
    "shipping" : 
    { 
     "normal":140, 
     "express":180 
    } 
    }]; 

    $scope.selectedCountry = $scope.countries[0]; 

$scope.changeShipping = function() {  
    return $scope.shippingPrice = $scope.selectedCountry.shipping.normal; 
}; 
}); 

Sie können eine Arbeits Geige here Vielen Dank im Voraus sehen!

+0

Sie meinen die Geige? Es ist dieses :) http://jsfiddle.net/zrnsvytd/ – Joe82

+0

Ja, ich habe meinen Kommentar entfernt, wenn Sie Ihre Frage mit dem Link zu der jsfiddle aktualisiert. –

+0

Kein Problem! Es scheint, wir waren nicht synchron :) – Joe82

Antwort

2

Verwenden Sie das ng-Modell mit input[radio] und legen Sie den Wert für die Änderung fest.

UPDATED JSFIDDLE

var app = angular.module('myApp', []); 
 
app.controller('myCtrl', function ($scope) { 
 
    $scope.shippingType = 'normal'; \t // initial value for input[radio] 
 

 
    $scope.countries = [{ 
 
     "name": "Freedonia", 
 
     "shipping": { 
 
      "normal": 30, 
 
      "express": 70 
 
     } 
 
    }, { 
 
     "name": "Mordor", 
 
     "shipping": { 
 
      "normal": 70, 
 
      "express": 110 
 
     } 
 
    }, { 
 
     "name": "Oz", 
 
     "shipping": { 
 
      "normal": 140, 
 
      "express": 180 
 
     } 
 
    }]; 
 

 
    $scope.selectedCountry = $scope.countries[0]; 
 

 
    $scope.changeShipping = function() { 
 
     $scope.shippingType = 'normal'; // set back to normal on country change 
 
     return $scope.shippingPrice = $scope.selectedCountry.shipping.normal; 
 
    }; 
 
});
.summary{ 
 
    background-color:gray; 
 
    border:1px solid black; 
 
    font-family:Arial; 
 
    margin-bottom:52px; 
 
    color:white; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-controller="myCtrl" ng-app="myApp"> 
 
    <div class="summary"> 
 
    Summary:<br> 
 
    Country:<select ng-model="selectedCountry" ng-options="country.name for country in countries" ng-change="changeShipping()"> 
 
    </select><br> 
 
    Shipping Costs: 
 
    {{selectedCountry.shipping[shippingType]}} 
 
    </div> 
 
    <div> 
 
    <select ng-model="selectedCountry" ng-options="country.name for country in countries" ng-change="changeShipping()"> 
 
    </select> 
 
    </div> 
 
    
 
    Shipping costs: 
 
    <form> 
 
    <input type="radio" name="shippingOptions" value="normal" ng-model="shippingType"> 
 
    Normal {{selectedCountry.shipping.normal}}<br> 
 
    <input type="radio" name="shippingOptions" value="express" ng-model="shippingType"> 
 
    Express {{selectedCountry.shipping.express}}<br> 
 
    </form> 
 
</div>

+0

Das ist in der Tat eine viel sauberere Lösung. Danke für die Einsicht! – Joe82

+0

@ Joe82 noch ein Tipp: Ihre 'changeShipping' Funktion konnte keinen Wert zurückgeben, da es keinen Sinn ergibt. Außerdem mag ich es, dass Sie 'ng-change' anstelle des Scope verwenden, es ist viel besser, obwohl die Leute normalerweise' $ watch' wählen. –

+1

Ja, danke ich sehe deine Korrektur. Ich habe in letzter Zeit über ng-change gelesen und es löst eine Menge Probleme, die $ watch mir gab (ich empfehle diesen Artikel jedem, der neu dazu ist http://www.codelord.net/2015/06/11/using) -ng-Wechsel-statt-von-$ watch-in-angular /) – Joe82