我想对2个单独的HTML元素使用控制器,并使用$ rootScope在编辑一个列表时使2个列表保持同步:
HTML
<ul class="nav" ng-controller="Menu"> <li ng-repeat="item in menu"> <a href="{{item.href}}">{{item.title}}</a> </li> </ul> <div ng-controller="Menu"> <input type="text" id="newItem" value="" /> <input type="submit" ng-click="addItem()" /> <ul class="nav" ng-controller="Menu"> <li ng-repeat="item in menu"> <a href="{{item.href}}">{{item.title}}</a> </li> </ul> </div>
JS
angular.module('menuApp', ['menuServices']). run(function($rootScope){ $rootScope.menu = []; }); angular.module('menuServices', ['ngResource']). factory('MenuData', function ($resource) { return $resource( '/tool/menu.cfc', { returnFormat: 'json' }, { getMenu: { method: 'GET', params: {method: 'getMenu'} }, addItem: { method: 'GET', params: {method: 'addItem'} } } ); }); function Menu($scope, MenuData) { // attempt to add new item $scope.addNewItem = function(){ var thisItem = $('#newItem').val(); MenuData.addItem({item: thisItem},function(data){ $scope.updateMenu(); }); } $scope.updateMenu = function() { MenuData.getMenu({},function(data){ $scope.menu = data.MENU; }); } // get menu data $scope.updateMenu(); }
页面加载时,UL和均DIV显示数据库中正确的内容,但是当我使用该addNewItem()方法时,仅DIV更新。
UL
DIV
addNewItem()
有没有更好的方法来组织我的逻辑,或者我可以做一些事情,以确保$scope.menu在UL获取的同时更新?
$scope.menu
这是类似的示例:http : //plnkr.co/edit/2a55gq
我建议使用包含菜单及其方法的服务。该服务将更新控制器引用的菜单。
在此处查看工作正常的pl客:http ://plnkr.co/edit/Bzjruq
这是示例JavaScript代码:
angular .module( 'sampleApp', [] ) .service( 'MenuService', [ '$rootScope', function( $rootScope ) { return { menu: [ 'item 1' ], add: function( item ) { this.menu.push( item ); } }; }]) .controller( 'ControllerA', [ 'MenuService', '$scope', function( MenuService, $scope ) { $scope.menu = MenuService.menu; $scope.addItem = function() { MenuService.add( $scope.newItem ); }; }]);
和示例HTML页面:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8"> <title>Custom Plunker</title> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script> <script src="app.js"></script> </head> <body ng-app="sampleApp"> <div ng-controller="ControllerA"> <ul> <li ng-repeat="item in menu">{{item}}</li> </ul> <input type="text" ng-model="newItem" /><input type="submit" ng-click="addItem()" /> </div> <div ng-controller="ControllerA"> <ul> <li ng-repeat="item in menu">{{item}}</li> </ul> </div> </body> </html>