13

I am using ng-repeat to render options with different value and text here, and also setting the default one.But again angular adds an empty undefined option.

<select ng-model="newItem.financial_year_id" required style="min-width:180px;">
   <option ng-repeat="financial in account_year" value="{{financial.id}}" ng-selected="financial.status=='Active'">{{financial.financial_year}}</option>
</select>

Now the active one is selected but the empty option still rendering.

2
  • you should try ng-options Commented Jan 26, 2014 at 9:01
  • @KhanhTO I have values like this, 1, 2013-2014, Active and 2,2014-2015, Inactive. If the status is Active, I need to set that option selected. Commented Jan 26, 2014 at 17:19

3 Answers 3

19

The empty option is generated when a value referenced by ng-model doesn't exist in a set of options passed to ng-options.

You can find the full answer+example on stackoverflow. here's the link

UPDATE:

here's an example:

 <select ng-model="newItem.financial_year_id" required style="min-width:180px;">
   <option ng-repeat="financial in account_year" value="{{financial.id}}" ng-selected="financial.status=='Active'">{{financial.financial_year}}</option>
</select>

in controller:

$scope.newItem={};
$scope.account_year=[{id:1,financial_year:"2013-2014",status:"Active"},
                     {id:2,financial_year:"2014-2015",status:"Inactive"}] 
//remove empty option
$scope.newItem.financial_year_id=$scope.account_year[0].id;

live example: http://jsfiddle.net/choroshin/5YDJW/7/

Sign up to request clarification or add additional context in comments.

6 Comments

I have values like this, 1, 2013-2014, Active and 2,2014-2015, Inactive. If the status is Active, I need to set that option selected. Can you help me to achieve this?
Can you tell me the change with my code? I can't rename the ng-model newItem, because I am passing this object to my submit function.I am getting one extra empty option in your jsfiddle example also.jsfiddle.net/choroshin/5YDJW/3
I updated my answer with new fiddle and you can see there is no empty option because I added $scope.newItem.financial_year_id=$scope.account_year[0].id;
I am using the same. It is not working. <select id="requestorSite" ng-model="selectedUserProfile" ng-options="userProfile.userProfileName for userProfile in userProfiles" class="form-control displayInlineBlock width40per marginLeft15"> </select>
Me too.. I edited his fiddle. I am getting 1 extra blank option.
|
9

Try ng-options instead:

<select ng-model="selectedFinancial" ng-options="c.financial_year for c in account_year"
        required style="min-width:180px;">
</select>

DEMO

You should think about redesigning your model like that to use ng-options. When we use <select>, there is only 1 selected item and this item should be a property of $scope referencing an item in the list => we don't need to duplicate 1 more property with "active" and "inactive" for all objects.

Your current model design makes sense when there are more than 1 selected item, but if there are more than 1, we should use a list of checkboxes instead of <select>

If you want to bind with Id, try this:

<select ng-model="selectedFinancialId" ng-options="c.id as c.financial_year for c in account_year"
        required style="min-width:180px;">
</select>

DEMO

8 Comments

The problem is, how can I set my own value to the options here? I need financial.id as value and financial.financial_year as option text.Your suggestion will make values like 0,1,etc..
@devo: You don't need to render your value into the options and should not care about that. When you work with angular, you should access all of this in your scope. For example: it's easy to access the id from your account_year array and your selectedFinancial. That's how Model and View separation comes into play.
I am using one object newItem to set my all form values and passing only that object to my form submit to use in ajax like this, ReceiptVoucher.save(data, function (response) { }, function (error) { // error }); Here the data is the passes newItem object.
@devo: You can just extract the id from selectedFinancial and construct the data you need to send. You want to bind to id field and just send it without extracting ?
Yes, I don't want to extract it from my js.
|
0

Ng-option is also a good way. But if you really want ng-repeat then use like this.

  $scope.newItem.financial_year_id=" ";

Initialize the variable when you start the controller. If you not initialize it then it takes as undefined. So the first empty value is present.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.