我有一个包含ng repeat指令和两个按钮的html表。第一个将打开一个包含新表单的模式,让我创建我的用户,然后单击保存将其添加到列表中。具有相同的原始格式并添加用户。
我不明白为什么当我单击形式不同的第一个按钮时我无法更新ng重复,但是对于第二个它却是可能的。这是代码:
homepage.jsp
<body ng-app="myApp"> <div class="generic-container" ng-controller="UserController as ctrl"> <div id="createUserContent.jsp" ng-include="createUserContent"></div> <table> <tr> <td> <button type="button" class="btn btn-primary" ng-click="ctrl.openCreateUser()">Create</button> </td> </tr> </table> <table class="table table-hover"> <thead> <tr> <th>ID.</th> <th>Name</th> <th>Address</th> <th>Email</th> <th width="20%"></th> </tr> </thead> <tbody> <tr ng-repeat="u in ctrl.users"> <td><span ng-bind="u.ssoId"></span></td> <td><span ng-bind="u.firstName"></span></td> <td><span ng-bind="u.lastName"></span></td> <td><span ng-bind="u.email"></span></td> </tr> </tbody> </table> </div> </body>
user_controller.js
'use strict'; App.controller('UserController', function ($scope, UserService, $window, $log, $uibModalStack, $uibModal, $rootScope) { var self = this; self.users = []; self.fetchAllUsers = function () { console.log('----------Start Printing users----------'); for (var i = 0; i < self.users.length; i++) { console.log('FirstName ' + self.users[i].firstName); } }; /** this function will not work **/ self.saveUser = function (user) { self.users.push(user); self.fetchAllUsers(); $log.log("saving user"); $uibModalStack.dismissAll(); }; /** this function works fine **/ self.addNewRow = function () { var specialUser = { id : 12, firstName : 'john', lastName: 'travolta', homeAddress : {location:'chicago'}, email : 'trav@email.com' }; self.users.push(specialUser); $log.log("saving specialUser"); }; self.openCreateUser = function () { var modalInstance = $uibModal.open({ animation : true, templateUrl : 'createUserContent', controller : 'UserController', resolve : { items : function () { return $scope.items; } } }); modalInstance.result.then(function (selectedItem) { $scope.selected = selectedItem; }, function () { $log.info('Modal dismissed at: ' + new Date()); }); }; self.fetchAllUsers(); });
createUserContent.jsp
<form role="form" ng-controller="UserController as ctrl" > <div class="form-group"> <label for="FirstName">FirstName</label> <input type="FirstName" ng-model="ctrl.user.firstName" class="form-control" id="FirstName" placeholder="Enter FirstName" /> <label for="lastName">lastName</label> <input type="lastName" class="form-control" id="lastName" ng-model="ctrl.user.lastName" placeholder="Enter lastName" /> <label for="email">Email address</label> <input type="email" ng-model="ctrl.user.email" class="form-control" id="email" placeholder="Enter email" /> </div> <div class="form-group"> <label for="homeAddressLocation">Home Address</label> <input class="form-control" ng-model="ctrl.user.homeAddress.location" id="homeAddressLocation" placeholder="homeAddressLocation" /> </div> <div class="form-group"> <label for="SSOId">SSOId</label> <input class="form-control" ng-model="ctrl.user.ssoId" id="SSOId" placeholder="SSOId" /> </div> <button type="submit" class="btn btn-default" ng-click="ctrl.saveUser(ctrl.user)">Save</button> <button type="submit" class="btn btn-default">Cancel</button> </form>
因为你的模式模板无法访问您的UserController对象,因为你在模式模板一样使用并没有显示错误 controlle [R所以重新装入新的Ctrl不指父Ctrl。
UserController
Ctrl
但是最好使用不同的 控制器 并将父 控制器 对象传递给模态 控制器 ,然后模体可以使用所有父对象。所以你应该将父对象传递给模态 控制器 。
当您createUserContent.jsp在主文件中包含弹出文件时,则无需ng-controller="UserController as ctrl"在modalInstance中使用的模态模板中使用controller : 'Ctrl',
ng-controller="UserController as ctrl"
controller : 'Ctrl',
喜欢:
var modalInstance = $uibModal.open({ templateUrl: 'createUserContent.jsp', controller: 'ModalCtrl', // ModalCtrl for modal controllerAs:'modal', // as modal so no need to use in modal template size: 'lg', resolve: { items: function () { return $scope.items; }, parent: function(){ // pass self object as a parent to 'ModalCtrl' return self; } }
和ModalCtrl这样的:
ModalCtrl
.controller('ModalCtrl', ['parent', function (parent) { this.parent = parent; }]);
这里用于ModalCtrl模态,modal因此您可以访问父对象,例如:modal.parent.user
modal
modal.parent.user
模板如下:
<form role="form" > <div class="form-group"> <label for="FirstName">FirstName</label> <input type="FirstName" ng-model="modal.parent.user.firstName" class="form-control" id="FirstName" placeholder="Enter FirstName" /> ..... .... <button type="submit" class="btn btn-default" ng-click="modal.parent.saveUser(modal.parent.user)">Save</button> <button type="submit" class="btn btn-default">Cancel</button> </form>
更多详细信息,请访问PLUNKER DEMO