Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using AngularJS, how do I bind a <select> element to an attribute that updates via a service

Tags:

I have a display controller and a management controller. Inside my display controller, I have a dropdown selector with the list of items that have been selected.

I can get the display area dropdown to update the list, adding items as they are added in the management controller, but I cannot figure out how to select the newest item in the dropdown.

<div ng-controller="MyDisplayCtrl">   <select ng-model="item" ng-options="i.name for i in items">   </select> </div> 

I have made a jsfiddle to illustrate my situation. Ultimately, though, my question is how to bind that ng-model="item" to a data source updated by a service.

http://jsfiddle.net/whtevn/mUhPW/2/

like image 237
whtevn Avatar asked Nov 07 '12 18:11

whtevn


People also ask

How can you bind an element to data in AngularJS?

AngularJS creates a two way data-binding between the select element and the $ctrl. orderProp model. $ctrl. orderProp is then used as the input for the orderBy filter.

What is $element in AngularJS?

$element is a jqlite (or jQuery if it is available) wrapped object containing a reference to some DOM objects as well as some helpful functions to interact with them. Any time you need to make changes to the DOM you would use $element .

What AngularJS directive can be used to bind the value of an input field to a variable?

With the ng-model directive you can bind the value of an input field to a variable created in AngularJS.

What are bindings in AngularJS?

Data binding in AngularJS is the synchronization between the model and the view. When data in the model changes, the view reflects the change, and when data in the view changes, the model is updated as well.


2 Answers

Well, it looks like I've found a pretty satisfactory answer to this.

I exposed the storage object itself through the controller

function MyDisplayCtrl($scope, ItemStore) {     $scope.items = ItemStore.items;     $scope.item  = ItemStore.currentItem;      // expose the itemstore service to the dom     $scope.store = ItemStore      $scope.getItem = function(){         return(ItemStore.currentItem);     } } 

and then address the currentItem directly

<div ng-controller="MyDisplayCtrl">     <select ng-model="store.currentItem" ng-options="i.name for i in items">     </select> </div> 

http://jsfiddle.net/whtevn/Cp2RJ/3/

like image 126
whtevn Avatar answered Nov 15 '22 14:11

whtevn


Try using ng-options:

<div ng-controller="MyDisplayCtrl">     <select ng-options="i.name for i in items"></select> </div> 

See: http://docs.angularjs.org/api/ng.directive:select

like image 21
btford Avatar answered Nov 15 '22 12:11

btford