0

I have a controller that works fine, but it seems like it should be refactored to include a service.

My controller uses two functions to change a display of ingredients. One tied to a select element for mobile, the other tied to links for desktops.

Is it possible to refactor this to use a service?

My html for Mobile:

<select ng-model="ingredient.item" ng-options="i.option for i in ingredient.items" ng-change="ingredient.change_select(ingredient.item)">
 <option value="">choose ingredient</option>
</select>

My html for Desktop:

<a ng-click="ingredient.change_tab('octopamine','Octopamine')">Octopamine</a>

My controller:

app.controller('IngredientsCtrl', function() {
 var ingredient = this;
 ingredient.items = [
 {
 'option': 'Brigham\'s Tea Leaf',
 'param' : 'brighamtea'
 },
 {
 'option': 'White Willow Bark Powder',
 'param' : 'white_willow'
 }];
 ingredient.tab = 'brighamtea';
 ingredient.tab_image = 'http://imgix.ximo365.com/brighamtea.jpg';
 ingredient.tab_title = 'Brigham\'s Tea Leaf';
 ingredient.change_select = function (item) {
 ingredient.tab = item.param;
 ingredient.tab_image = 'http://imgix.ximo365.com/' + item.param + '.jpg';
 ingredient.tab_title = item.option;
 }
 ingredient.change_tab = function(param,title) {
 ingredient.tab = param;
 ingredient.tab_image = 'http://imgix.ximo365.com/' + param + '.jpg';
 ingredient.tab_title = title;
 }
});
asked Nov 15, 2015 at 7:09

1 Answer 1

1

Absolutely.

Create a factory/service like: IngredientsService

Use dependency injection to introduce this service in the controller.

// Example

app.controller('IngredientsCtrl'), function(IngredientsService) {
 // Create reusable service methods
 IngredientsService.change_select(item);
 IngredientsService.change_tab(param, title);
});

You could also manage the default items list in the service to keep things DRY if you use this in multiple areas like other controllers, directives, or services.

Using services also lets you test in isolation and mock out dependencies in your controller.

answered Nov 15, 2015 at 7:55
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.