我尝试使用 AngularJS 解决一个经典问题:我需要显示一些实体的列表并提供添加、编辑和查看这些实体的详细信息的能力。
我实现了两个控制器:ListController 来迭代实体列表和 ItemController 来显示和保存实体详细信息。这是html代码:
<div ng-app="myApp">
<a class="btn" data-toggle="modal" data-target="#modal">Add new item</a>
<div ng-controller="ListController">
<h4>List</h4>
<ul>
<li ng-repeat="item in list">
{{item.name}}
<a class="btn" data-toggle="modal" data-target="#modal" ng-click="editItem(item)">Edit item</a>
</li>
</ul>
</div>
<div id="modal" role="dialog" class="modal hide fade">
<div ng-controller="ItemController">
<div class="modal-header">
Item Dialog
</div>
<div class="modal-body">
<label for="txtName" />
<input type="text" id="txtName" ng-model="item.name" />
</div>
<div class="modal-footer">
<button class="btn btn-primary" ng-click="saveItem()" data-dismiss="modal">OK</button>
</div>
</div>
</div>
和控制器代码:
var db_list = [{ name: "Test1" }, { name: "Test2" }];
var app = angular.module('myApp', []).
controller('ListController', function($scope, $rootScope) {
$scope.list = db_list;
$scope.editItem = function(item) {
$rootScope.item = item;
}
}).
controller('ItemController', function($scope, $rootScope) {
$scope.saveItem = function() {
db_list.push($rootScope.item);
$rootScope.item = null;
}
});
您还可以在http://jsfiddle.net/yoyoseek/9Qntw/16/找到工作原型。
此代码中的一般问题是我存储实体以使用 ListController 的范围显示其描述(通过 editItem()),但我需要在 ItemController 中存储此实体详细信息。我使用 $rootScope 来共享实体进行编辑,对我来说它看起来像是 hack。这是正常的做法吗?
此代码还有一个缺点:必须在模式对话框隐藏时清除 $rootScope.item。