angularjs – 为所有CRUD操作使用相同的控制器(Rails相似)

前端之家收集整理的这篇文章主要介绍了angularjs – 为所有CRUD操作使用相同的控制器(Rails相似)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个角度控制器,可以在创建时获取资源:
angular.module('adminApp')
  .controller('PropertiesCtrl',function ($log,$scope,Property,$location) {
    $scope.properties = Property.query()  
  });

现在我想向控制器添加逻辑以便能够创建“Property”资源:

angular.module('adminApp')
  .controller('PropertiesCtrl',$location) {
    $scope.properties = Property.query()  
    $scope.create = function(){
      //logic to create
    };
  });

但是,当我在表单上创建“属性”时,会先进行不必要的调用获取所有属性.我该如何避免这种情况?

潜在解决方

>我可以创建一个单独的控制器,专门用于创建不会获取属性的Property.但是,它可以简化在单个控制器下封装单个资源的所有CRUD操作.
>我可以创建一个函数获取所有属性.但是,我的索引页面直接使用“属性”.我首先需要获取数据调用一些方法,然后使用数据(不知何故?)

我的反应是,听起来你正在尝试将控制器用作服务,就像你试图将许多功能集成到一个控制器中一样.

所以你应该考虑两件主要的事情.首先,创建控制器非常重要,每个控制器只有一个特定的用途.请注意,这与仅使用控制器一次不同,如果您有一个应该出现在多个位置的功能,您会被鼓励在几个不同的地方使用相同的控制器.它只是意味着控制器不应该同时做几件事.

我们以照片库为例.虽然您可以创建一个获取所有照片的控制器,让您添加新照片,并允许您编辑和删除现有照片,这将是一个坏主意.如果您决定添加照片也可以从另一个页面“第X页”完成,该怎么办?如果您在何处重用同一个控制器,那么您还可以从服务器请求库,并为您不打算在该页面上设置的内容设置控件.

如果您改为制作一个仅负责获取内容的控制器,另一个用于添加新照片的控制器,另一个用于编辑的控制器等,那么这将很容易.您只需在“Page X”上实现create-controller,您就不必担心意外触发超出您想要的内容.您可以选择在页面上实现所需的功能,并且只选择该功能.这也使您的控制器小巧,易于阅读和快速编辑/修正,因此这是一个双赢的局面!

其次,如果您想将所有CRUD资源收集到一个对象(我也想做),它们不应该在控制器中,它们应该在服务中.所以你有一个PhotoAPI,它暴露了CREATE,READ,UPDATE和DELETE函数.然后您的索引控制器只调用READ函数,您的创建控制器调用CREATE函数等.控制器定义哪些函数和数据可用,但逻辑​​在组合服务中.这样你就可以聚集你的资源,使它们易于查找,而不会产生组合控制器的问题.

所以类似于:

app.service('PhotoAPIService',[
function() {
   this.READ = function() {
     // Read logic
   }

  this.CREATE = function() {
     // Create logic
   }
}]);

app.controller('PhotoIndexController',[
'$scope','PhotoAPIService',function($scope,PhotoAPIService) {
   $scope.photos = PhotoAPIService.READ(<data>);
}]);


app.controller('PhotoCreateController',PhotoAPIService) {
   $scope.createPhoto = PhotoAPIService.CREATE;
}]);

猜你在找的Angularjs相关文章