jwhite30 jwhite30 - 7 months ago 14
Javascript Question

Updating modal with data passing in angular

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>

Answer

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>