What are the key steps to ensure that an AngularJS example runs effectively?

I stumbled upon this code snippet and I want to incorporate it into my tutorial project.

The issue I'm facing is that in this

'use strict';

var app = angular.module('myApp', ['app.directives']);

app.controller('AppCtrl', function($scope){                     
    $scope.roles = [
          {"id": 1, "name": "Manager", "assignable": true},
          {"id": 2, "name": "Developer", "assignable": true},
          {"id": 3, "name": "Reporter", "assignable": true}
    ];
    
    $scope.member = {roles: []};
    $scope.selected_items = [];
});

var app_directives = angular.module('app.directives', []);

app_directives.directive('dropdownMultiselect', function(){
   return {
       restrict: 'E',
       scope:{           
            model: '=',
            options: '=',
            pre_selected: '=preSelected'
       },
       template: "<div class='btn-group' data-ng-class='{open: open}'>"+
        "<button class='btn btn-small'>Select</button>"+
                "<button class='btn btn-small dropdown-toggle' data-ng-click='open=!open;openDropdown()'><span class='caret'></span></button>"+
                "<ul class='dropdown-menu' aria-labelledby='dropdownMenu'>" + 
                    "<li><a data-ng-click='selectAll()'><i class='icon-ok-sign'></i>  Check All</a></li>" +
                    "<li><a data-ng-click='deselectAll();'><i class='icon-remove-sign'></i>  Uncheck All</a></li>" +                    
                    "<li class='divider'></li>" +
                    "<li data-ng-repeat='option in options'> <a data-ng-click='setSelectedItem()'>{{option.name}}<span data-ng-class='isChecked(option.id)'></span></a></li>" +                                        
                "</ul>" +
            "</div>" ,
       controller: function($scope){
           
           $scope.openDropdown = function(){        
                    $scope.selected_items = [];
                    for(var i=0; i<$scope.pre_selected.length; i++){                        $scope.selected_items.push($scope.pre_selected[i].id);
                    }                                        
            };
           
            $scope.selectAll = function () {
                $scope.model = _.pluck($scope.options, 'id');
                console.log($scope.model);
            };            
            $scope.deselectAll = function() {
                $scope.model=[];
                console.log($scope.model);
            };
            $scope.setSelectedItem = function(){
                var id = this.option.id;
                if (_.contains($scope.model, id)) {
                    $scope.model = _.without($scope.model, id);
                } else {
                    $scope.model.push(id);
                }
                console.log($scope.model);
                return false;
            };
            $scope.isChecked = function (id) {                 
                if (_.contains($scope.model, id)) {
                    return 'icon-ok pull-right';
                }
                return false;
            };                                 
       }
   } 
});
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="AppCtrl">    
    <dropdown-multiselect pre-selected="member.roles" model="selected_items" options="roles"></dropdown-multiselect>
    
    
    <pre>selected roles = {{selected_items | json}}</pre>
</div>

the property defined hard-coded:

  name
    id

So if the names of my fields are different than those used in the example, it will not work properly.

Any suggestions on what changes I need to make in my code to accommodate different field names?

Answer №1

'use strict';

var app = angular.module('myApp', ['app.directives']);

app.controller('AppCtrl', function($scope){                     
    $scope.roles = [
          {"id": 1, "name1": "Manager", "assignable": true},
          {"id": 2, "name1": "Developer", "assignable": true},
          {"id": 3, "name1": "Reporter", "assignable": true}
    ];
    
    $scope.member = {roles: []};
    $scope.selected_items = [];
    $scope.displayname = "name1";
});

var app_directives = angular.module('app.directives', []);

app_directives.directive('dropdownMultiselect', function(){
   return {
       restrict: 'E',
       scope:{           
            model: '=',
            options: '=',
            displayname: '=',
            pre_selected: '=preSelected'
       },
       template: "<div class='btn-group' data-ng-class='{open: open}'>"+
        "<button class='btn btn-small'>Select</button>"+
                "<button class='btn btn-small dropdown-toggle' data-ng-click='open=!open;openDropdown()'><span class='caret'></span></button>"+
                "<ul class='dropdown-menu' aria-labelledby='dropdownMenu'>" + 
                    "<li><a data-ng-click='selectAll()'><i class='icon-ok-sign'></i> Check All</a></li>" +
                    " <li><a data-ng-click='deselectAll();'><i class='icon-remove-sign'></i> Uncheck All</a></li>" +                    
                    "<li class='divider'></li>" +
                    "<li data-ng-repeat='option in options'> <a data-ng-click='setSelectedItem()'>{{option[displayname]}}<span data-ng-class='isChecked(option.id)'></span></a></li>" +                                        
                "</ul>" +
            "</div>" ,
       controller: function($scope){
           console.log($scope.displayname);
           $scope.openDropdown = function(){        
                    $scope.selected_items = [];
                    for(var i=0; i<$scope.pre_selected.length; i++){                        $scope.selected_items.push($scope.pre_selected[i].id);
                    }                                        
            };
           
            $scope.selectAll = function () {
                $scope.model = _.pluck($scope.options, 'id');
                console.log($scope.model);
            };            
            $scope.deselectAll = function() {
                $scope.model=[];
                console.log($scope.model);
            };
            $scope.setSelectedItem = function(){
                var id = this.option.id;
                if (_.contains($scope.model, id)) {
                    $scope.model = _.without($scope.model, id);
                } else {
                    $scope.model.push(id);
                }
                console.log($scope.model);
                return false;
            };
            $scope.isChecked = function (id) {                 
                if (_.contains($scope.model, id)) {
                    return 'icon-ok pull-right';
                }
                return false;
            };                                 
       }
   } 
});
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="AppCtrl">    
    <dropdown-multiselect pre-selected="member.roles" model="selected_items"  displayname ="displayname" options="roles"></dropdown-multiselect>
    
    
    <pre>selected roles = {{selected_items | json}}</pre>
</div>

Answer №2

Personally, I believe it's completely acceptable to require specified key input as part of the API. However, there is also the flexibility to customize this by providing additional parameters to the directive.

.directive(function(){
    return {
        scope: {
            options: '=',
            keys: '='
        },
        template: "<div ng-repeat='option in options'> \
                {{option[key.id]}} - {{option[key.name]}} \
            <div>",
        controller: function($scope){
            // set default values if keys are not provided
            if (!$scope.keys) $scope.keys = {id: 'id', name: 'name'};

            angular.forEach($scope.options, function(option){
                // access id using option[$scope.key.id]
                // access name using option[$scope.key.name]
            });
        }
    }
})

When using the directive, make sure to specify which keys correspond to id and name.

$scope.test = [
    {serial: 123, product: 'apple'},
    {serial: 124, product: 'orange'}
]

$scope.keys = {id: 'serial', name: 'product'};

<dropdown-multiselect model="selected_items" options="test" keys="keys"></dropdown-multiselect>

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Interact between two identical directives with isolated scopes

As a newcomer to AngularJS, I am encountering an issue with communication between two instances of the same custom directive that has an isolated scope. How can this be achieved? Any guidance or suggestions would be greatly appreciated. <div date-contr ...

Unable to successfully add a user to CouchDB using Angular, although it functions correctly when using Postman

UPDATE: A recent issue was resolved by enabling PUT in the couchDB config under cors. Once this setting was enabled, everything functioned properly! I am currently attempting to add a new user to couchDB and have successfully done so using postman as an e ...

When you use Array.push, it creates a copy that duplicates all nested elements,

Situation Currently, I am developing a web application using Typescript/Angular2 RC1. In my project, I have two classes - Class1 and Class2. Class1 is an Angular2 service with a variable myVar = [obj1, obj2, obj3]. On the other hand, Class2 is an Angular2 ...

What's preventing the bind click event from working properly?

I have a unique Vue application setup like this: index.html structure: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>vuejs-test01</title> <link href="./src/assets/styles/style. ...

How to extract data from a JSON file using AngularJS

I have successfully managed to read the JSON content from a file in a Chrome app, but I am struggling to assign the returned JSON content to $scope.somevar. Every time I try to initialize $scope.somevar inside a method, it goes out of scope. SearchApp.con ...

How can we simplify deeply nested ajax callbacks in programming?

I have come across JavaScript code where the success callback of an Ajax handler triggers another Ajax call, which in turn may trigger yet another Ajax call. This results in deeply nested anonymous functions. Is there a smarter programming approach that ...

jQuery tooltip anchored to the left side of the screen, ignoring all attempts to adjust its position

I have a jQuery tooltip that is supposed to hover over the table header, but it is displaying on the far left side of my screen with no formatting - just black text. I have attempted to use the placement and position jQuery attributes, but they do not seem ...

I'm looking to transform this array into the format described below, and also include another nested subarray within it using TypeScript

[{ "header": "API", "value": "hello" }, { "header":"API", "value":"yellow" }, { "header":"Other", "value":"yallow"}, { "header":"other", "value":"othertt" } ] I have a list of objects with he ...

I'm curious about how to properly escape single quotes when passing a variable in a Java argument call using Karate DSL. Can you help

As part of our API project at work, I am looking to incorporate database calls into our end-to-end process. One challenge I am facing is how to handle single quotes within a variable that is passed as an argument in an assert method. I have attempted the f ...

What is the most effective way to modify the state within an array?

I'm working on a code that updates the is_confirmed property of orders to 1 by looping through all of them. However, I find it time-consuming to have to search for the order ID and then update it individually. Is there a more efficient way to accompl ...

Is there a way to define the width of an element within the display:flex property in CSS?

Could you please review the following: https://codepen.io/sir-j/pen/dyRVrPb I am encountering an issue where setting the input [type=range] to 500px doesn't seem to make a difference from 100px, 500px, or 800px. This leads me to believe that display ...

Modify input attribute by selecting a label

What I'm looking for: I am trying to add a checked status to the input field when a label is clicked. However, when I attempted this, I received two alerts displaying "true." This behavior is incorrect, and upon inspection in Firebug, the input fiel ...

(AJAX/PHP) What could be causing the issue with my POST request in this simple example?

Check out my JavaScript snippet below: var xhr = new XMLHttpRequest(); xhr.open("POST", "pants.php", true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { var slot = document.getElementsByTagName("section")[0].innerHTML = xh ...

Warning: Unhandled promise rejection (id: 2) - Pass phrase must be of type buffer

I'm encountering an error message saying "UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Pass phrase must be a buffer" whenever I try to input data into my passport and use the post request in "/registrar" ...

Using isClient in Gridsome: What You Need to Know

While working with the FirebaseUI and Gridsome plugin, I encountered an error message stating ReferenceError: window is not defined. This issue arises from server-side rendering (SSR) as FirebaseUI attempts to access the browser-specific window object. Af ...

Ways to eliminate an object from an array using Javascript or Jquery

I have two arrays of objects (with the same properties) where I need to remove all objects with the same name as those found in filesToRemove from the array files. However, when I attempt to use the code below, it throws an error: Uncaught TypeError: fil ...

The powerful combination of Nuxt, Vuex, and Computed Properties allows for

Currently exploring Nuxt.js with Vuex, I have created a basic form containing an email field, a password field, and a button. All my state, mutations, and actions are functioning correctly. However, I encountered an issue when trying to create a computed ...

Is there a way to incorporate arguments into my discord.js commands?

Hey there! I'm looking to enhance my Discord commands by adding arguments, such as !ban {username}. Any tips or guidance on the best approach for this would be amazing! const Bot = new Discord.Bot({ intents: ["GUILD_MESSAGES", "GUIL ...

Mastering data binding with Vue Js is a process that requires dedication and time

I'm a Vue JS beginner and I've created a component that repeats a grid-like section. However, I've noticed that adding a dropdown in the grid is causing a significant increase in load time. As the number of records grows, the load time will ...

Strategies for improving checkbox selection logic and reducing the number of loops in React

In my current React project, I have implemented multiple lists of items with checkboxes, inspired by Shopee's shopping cart page. While I've successfully added the checkbox functionality using React state and event handling for individual checkbo ...