我有一个简单的Angular JS场景。我在一个视图中显示了一个专家列表,该列表包含编辑专家的操作,该操作将在另一视图中完成。这些视图来自服务器,并且不在一个文件中。它们不会一起加载。
<!-- experts.html --> <div ng-controller='expertController'> <!-- showing the list of experts here --> </div>
在服务器上的另一个文件中,我有:
<!-- expert.html --> <div ng-controller='expertController'> <!-- a form to edit/add an expert --> </div>
我的控制器是:
app.controller('expertController', function ($scope) { $scope.getExperts = function () { _.get('/expert/getexperts/', null, function (data) { $scope.$apply(function () { $scope.experts = data; }); }); }; $scope.editExpert = function (index) { _.get('/expert/getexpert/', { id: $scope.experts[index].Id }, function (data) { $scope.$apply(function () { $scope.expert = data; }); }); }; });
但是,任何数据都不会显示在编辑表单中。我使用Batarang检查了范围,但expert不会显示对象。
expert
问题似乎是我在一个控制器上使用了两个(可能有两个以上)视图。但是,正如我在SO上阅读过其他一些问题一样,最好的做法似乎是每个HTML视图有一个控制器。
但是,我认为让一个expertController人执行所有CRUD操作以及与之相关的其他操作更加一致和一致expert。我认为expertEditController编辑表单和expertListController列表HTML 有点难看。
expertController
expertEditController
expertListController
最佳做法是什么?我如何拥有一个连贯且在语义上命名的控制器,同时支持许多视图。在到目前为止所见的任何MVC框架中,通过一个控制器支持许多视图都是一种例行程序。
当然,您可以将许多views相同的东西一起使用controller。例如:用于编辑和添加新项目。
views
controller
但是您必须记住,每次加载视图时, 都会初始化控制器 并重新$scope注入新的 控制器 。
$scope
在您的情况下,最好只使用两个单独的控制器(一个用于一个experts,一个用于expert),并使用(可选)一些服务在它们之间进行通信,并可能提供某种缓存机制。
experts
更新 如果要在控制器之间提供某些通用/共享功能,最好的方法是创建然后创建inject单独的服务。它保持代码干燥。
inject