当前位置: 首页 > 面试题库 >

对所有CRUD操作使用相同的控制器(类似于Rails)

朱海超
2023-03-14
问题内容

我有一个角度控制器,可在创建时获取资源:

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

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

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

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

潜在的解决方案

  1. 我可以创建一个单独的控制器,专门用于创建不会获取属性的Property。但是,这将使封装单个资源在单个控制器下的所有CRUD操作变得更加简单。
  2. 我可以创建一个函数来获取所有属性。但是,我的索引页直接使用“属性”。我首先需要获取调用某些方法的数据,然后使用该数据(以某种方式?)

问题答案:

我的反应是,听起来您正在尝试将控制器用作服务,并且您正在尝试将多个功能集成到一个控制器中。

因此,您应该考虑两件事。首先,创建控制器非常重要,每个控制器仅具有一个特定的 目的 。请注意,这 不是
一回事使用控制器只有一次,你encuraged如果有应该出现在不止一个地方的特征使用相同的控制器在几个不同的地方。这仅意味着控制器不应一次执行多项操作。

让我们以照相馆为例。虽然您可以创建一个控制器来获取所有照片,让您添加新照片,并让您一并编辑和删除现有照片,但这不是一个好主意。如果您决定也可以从另一个页面“页面X”添加照片怎么办?如果您要在哪里重复使用同一控制器,那么您还需要从服务器请求图库,并为不希望出现在该页面上的内容设置控件。

如果改用一个仅负责获取内容的控制器,一个单独的控制器来添加新照片,另一个用于编辑等等,那么这将很容易。您只需在“第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', [
'$scope',
'PhotoAPIService',
function($scope, PhotoAPIService) {
   $scope.createPhoto = PhotoAPIService.CREATE;
}]);


 类似资料:
  • 我试图将所有映射到相同的DTO类,我希望避免为每个类型声明一个方法,或者为每个枚举字段使用。 然后在我的其他地图上 但MapStruct仍在为每种枚举类型生成一种新的映射方法,而且实现方式不符合我的需要。 有没有办法用MapStruct做到这一点?还是太神奇了D

  • 我们将在本章中讨论的基本CRUD操作是使用Angular 2从Web服务读取数据。 例子 (Example) 在这个例子中,我们将定义一个数据源,它是一个简单的产品json文件。 接下来,我们将定义一个服务,用于从json文件中读取数据。 然后,我们将在我们的主app.component.ts文件中使用此服务。 Step 1 - 首先让我们在Visual Studio代码中定义我们的product

  • 如果已知主键的值,那么可以使用这些方法进行 CRUD 操作 对 object 操作的四个方法 Read / Insert / Update / Delete o := orm.NewOrm() user := new(User) user.Name = "slene" fmt.Println(o.Insert(user)) user.Name = "Your" fmt.Println(o.Up

  • 我的控制器 这是我的控制器测试用例 我正在将User对象转换为string并将其发布到控制器方法。我正在尝试模拟userService.validateUser()将返回新的空User对象的服务方法。由于发布到service方法的对象和控制器接收到的对象不同,所以service返回null。如何让service方法返回空用户对象?

  • 这个动作被一个LoginController映射,成功登录后,用户回到相同的,但作为登录用户,并用欢迎消息迎接用户。 index.htm还有另一个名为itemform的表单,它允许用户将项目名称作为文本添加。此操作由itemController控制。 我的问题是我的LoginController和itemController都有相同的请求映射,因此我得到了这个错误: 创建名为“org”的bean时

  • 问题内容: 嘿,我一直在用Java在Windows控制台中开发一个应用程序,并希望将其在线发布在所有console-graphics-glory中。 我可以使用一个简单的Web applet API来移植我的应用程序吗? 我仅使用基本的System.out和System.in功能,但是很高兴重建我的I / O包装器。 我认为,对于希望将其工作放在网上的任何新手Java开发人员而言,遵循这些思路将是