Reputation: 23
for a school project I am creating an application using AngularJS. I am trying to create a dropdown menu that sets the selected language using a button.
JS:
app.controller('NavCtrl',['$scope','$translate', function($scope,$translate){
$scope.languages = [
{ language: "en", },
{ language: "nl" }
];
$scope.selectedlanguage = $scope.languages[1];
$scope.ChangeLanguage = function (lang) {
$translate.use(lang);
}
}])
HTML:
<div ng-controller="NavCtrl">
<select ng-model="selectedlanguage"
ng-change="option(this.selectedlanguage)"
ng-options="i.language for i in languages">
</select>
{{selectedlanguage.language}}
<button class="button button-clear"
ng-click="ChangeLanguage('{{selectedlanguage.language}}')">
Set language
</button>
</div>
At the moment the button always sets my language to [1] (nl), how do I get it to set the language to the language selected in the dropdown menu?
Upvotes: 2
Views: 4523
Reputation: 42480
I can see a few problems.
First, you don't need the this.selectedLanguage
in your view, as $scope
is automatically assumed as your context:
ng-change="option(selectedlanguage)"
Second, in your controller, you are setting $scope.selectedlanguage
to an i
, but then binding it to i.language
in the view. To fix this, try:
ng-options="i as i.language for i in languages"
The x as y
syntax lets you bind x
to the model, while showing y
for your dropdown label.
https://docs.angularjs.org/api/ng/directive/ngOptions
Third, as @Matthew Berg points out, you don't need the {{...}}
in you click handler:
ng-click="ChangeLanguage(selectedlanguage.language)"
Here's a plunkr with everything working:
http://plnkr.co/edit/YZf3vsKQEucOsKFLlYoQ?p=preview
Upvotes: 2
Reputation: 2148
use this code::::
<div ng-controller="NavCtrl">
<select ng-model="selectedlanguage" ng-change="option(selectedlanguage)" ng-options="i as i.language for i in languages"></select>
{{selectedlanguage.language}}
<button class="button button-clear" ng-click="ChangeLanguage(selectedlanguage)">Set language</button>
</div>
Upvotes: 1
Reputation: 28750
No need to wrap it in {{...}}
<div ng-controller="NavCtrl">
<select ng-model="selectedlanguage"
ng-change="option(this.selectedlanguage)"
ng-options="i.language for i in languages">
</select>
{{selectedlanguage.language}}
<button class="button button-clear"
ng-click="ChangeLanguage(selectedlanguage)">
Set language
</button>
</div>
Upvotes: 3
Reputation: 1609
Can you check lang value inside $scope.ChangeLanguage function? I think it is always {{selectedlanguage.language}}.
Change: "ChangeLanguage(selectedlanguage.language)"
Upvotes: 1