3

Really new to angular, but I have this to-do list working. I added a modal button and I want the task item to update inside each modal that gets created. For some reason, I cannot get the modal to display the correct name of the task item it is assigned to. It is stuck referencing index 0 for all modals.

first modal correct

second modal still reflecting first

here is the html:

<header>
    <ul class="nav nav-tabs">
        <li role="presentation" class="active">
            <a href="#/">Home</a>
        </li>
        <li role="presentation">
            <a href="#/second">History</a>
        </li>
    </ul>
</header>
<center>
    <div>
        <div class="form-group">
            <div class="col-xs-12 col-sm-8 col-md-4 col-lg-4 col-centered" id="nv">
                <div class="row"></div>
                <input ng-model="newItem" ng-keypress="addItem($event)" type="text" class="form-control lead" id="nv" placeholder="Add a grocery.">
            </div>
        </div>
    </div>
</center>
<div id="mainBox">
    <ul class="list-group checked-list-box" id="repeatBox">
        <li class="list-group-item col-xs-12 col-sm-8 col-md-4 col-lg-4 col-centered" id="liBox" ng-repeat="x in displayHold" >
            <input type="checkbox" ng-model="deleted"></input>

            <h7 id="lItem" class="lead" ng-class="{strike: deleted,notActive: deleted}">{{x.item}}</h7>
            <button type="button" class="btn btn-default pull-right" ng-click="rmList(x)">
                <span class="glyphicon glyphicon-trash" id="icon"></span>
            </button>
            <button type="button" class="btn btn-default pull-right" data-toggle="modal" data-target="#myModal">
                <span class="glyphicon glyphicon-plus" id="icon"></span>
            </button>
            <div class="container">
                <div id="myModal" class="modal fade" role="dialog">
                    <div class="modal-dialog">
                        <div class="modal-content">
                            <div class="modal-header">
                                <button type="btn btn-default" class="close" data-dismiss="modal">&times;</button>
                                <h4 class="modal-title">{{modalItem(x)}}</h4>
                            </div>
                            <div class="modal-body lead">
                                <p>{{displayHold.x}}</p>
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </li>

    </ul>
</div>

and js:

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

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/', {
            templateUrl: 'templates/home.html',
            controller: 'homeCTRL'
        })
        .when('/second', {
            templateUrl: 'templates/second.html',
            controller: 'secondCTRL'
        })
        .otherwise({
            redirectTo: '/'
        });
}]);

//services

//history
app.service('carry', function() {
    var transferAr = [];
    var addList = function(newObj) {
        transferAr.push({
            item: newObj
        });
    };
    var getList = function() {
        return transferAr;
    };
    return {
        addList: addList,
        getList: getList,
    };
});
//home temporary
app.service('hold', function() {
    var holdTransferAr = [];
    var holdAddList = function(newObj) {
        holdTransferAr.push({
            item: newObj
        });
    };
    var holdGetList = function() {
        return holdTransferAr;
    };
    return {
        holdAddList: holdAddList,
        holdGetList: holdGetList,
    };
});

//controllers
app.controller('homeCTRL', ['$scope', 'carry', 'hold', '$log', function($scope, carry, hold, $log) {
    $scope.newItem = '';

    $scope.addItem = function(e) {
        if (e.which === 13) {
            hold.holdAddList($scope.newItem);
            $scope.newItem = '';
        }
    };

    $scope.displayHold = hold.holdGetList();

    $scope.rmList = function(item) {
        //get index of displayHold
        $scope.index = $scope.displayHold.indexOf(item);

        //add it to historylist
        carry.addList($scope.displayHold[$scope.index].item);
        //remove displayHold
        $scope.displayHold.splice($scope.index, 1);
    };

    $scope.modalItem = function(item){

      $scope.index = $scope.displayHold.indexOf(item);
      return $scope.displayHold[$scope.index].item;
  };




}]);

app.controller('secondCTRL', ['$scope', 'carry', function($scope, carry) {

    $scope.controller2Ar = carry.getList();

}]);

second.html

<header>
    <ul class="nav nav-tabs">
        <li role="presentation">
            <a href="#/">Home</a>
        </li>
        <li role="presentation" class="active">
            <a href="#/second">History</a>
        </li>
    </ul>
</header>

<div id="mainBox">
    <ul ng-repeat="x in controller2Ar" class="list-group" id="repeatBoxAlt">
        <li class="list-group-item col-xs-12 col-sm-8 col-md-4 col-lg-4 col-centered lead strike">
          <center>
            <h7>{{x.item}}</h7>
          </center>
        </li>
    </ul>
</div>

here is the index.html

<!DOCTYPE HTML>
<html ng-app="app">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href='https://fonts.googleapis.com/css?family=Roboto:400,500' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="https://bootswatch.com/paper/bootstrap.min.css"/>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
        <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

        <link rel="stylesheet" href="main.css"/>
    </head>
    <body>

        <div ng-view></div>

        <script src="node_modules/angular/angular.min.js"></script>
        <script src="node_modules/angular-route/angular-route.min.js"></script>
        <script src="app.js"></script>
    </body>
</html>

1 Answer 1

1

It's because your modals do not have unique id's and triggers:

Add {{index}} or a unique identifier to both the modal id and the trigger to display the modal.

<header>
    <ul class="nav nav-tabs">
        <li role="presentation" class="active">
            <a href="#/">Home</a>
        </li>
        <li role="presentation">
            <a href="#/second">History</a>
        </li>
    </ul>
</header>
<center>
    <div>
        <div class="form-group">
            <div class="col-xs-12 col-sm-8 col-md-4 col-lg-4 col-centered" id="nv">
                <div class="row"></div>
                <input ng-model="newItem" ng-keypress="addItem($event)" type="text" class="form-control lead" id="nv" placeholder="Add a grocery.">
            </div>
        </div>
    </div>
</center>
<div id="mainBox">
    <ul class="list-group checked-list-box" id="repeatBox">
        <li class="list-group-item col-xs-12 col-sm-8 col-md-4 col-lg-4 col-centered" id="liBox" ng-repeat="x in displayHold track by $index" >
            <input type="checkbox" ng-model="deleted"></input>

            <h7 id="lItem" class="lead" ng-class="{strike: deleted,notActive: deleted}">{{x.item}}</h7>
            <button type="button" class="btn btn-default pull-right" ng-click="rmList(x)">
                <span class="glyphicon glyphicon-trash" id="icon"></span>
            </button>
            <button type="button" class="btn btn-default pull-right" data-toggle="modal" data-target="#myModal{{index}}">
                <span class="glyphicon glyphicon-plus" id="icon"></span>
            </button>
            <div class="container">
                <div id="myModal{{index}}" class="modal fade" role="dialog">
                    <div class="modal-dialog">
                        <div class="modal-content">
                            <div class="modal-header">
                                <button type="btn btn-default" class="close" data-dismiss="modal">&times;</button>
                                <h4 class="modal-title">{{modalItem(x)}}</h4>
                            </div>
                            <div class="modal-body lead">
                                <p>{{displayHold.x}}</p>
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </li>

    </ul>
</div>
Sign up to request clarification or add additional context in comments.

2 Comments

Can you give an explanation of what I was doing wrong just for clarification? I understand that it was just referencing the initial modal and everytime I created a new one, the modals were created but the button was just pointing at the first one.
Ok so you had multiple modals with the same id and one trigger referencing that id. The trigger was bound to the first modal and every time you clicked the trigger it triggered the first modal.

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.