【发布时间】:2012-11-01 15:28:47
【问题描述】:
我想在 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 中的$scope.menu 同时得到更新?
这是一个类似的例子:http://plnkr.co/edit/2a55gq
【问题讨论】:
-
您可以将菜单与更新菜单本身的方法一起保存在服务中,并让服务通过 $rootScope.$broadcast 广播更新的菜单。控制器已使用 $scope.$on 监听事件并通过 $scope.menu = ... 更新对菜单的区域设置引用
-
我更新了我的答案,以防你想知道如何在指令中做到这一点。
-
这个答案还包括一个非常有用的视频:stackoverflow.com/a/13882619/109941
标签: javascript data-binding controller angularjs