AngularJS:路由和控制器的最佳实践

AngularJS:路由和控制器的最佳实践,angularjs,model-view-controller,angularjs-ng-route,angular-controller,Angularjs,Model View Controller,Angularjs Ng Route,Angular Controller,在我们公司,我们目前正在开发一个单页web应用程序。用户可以登录并用数据填充他们的个人资料,并与其他订阅者共享这些资料(这是一个社交网络应用程序)。 现在,我想象了这个模式: 用户数据由UserService提供,使用RESTAPI恢复配置文件信息 配置文件相关页面由唯一控制器(ProfileController)管理 我的问题是:将路由(比方说“查看配置文件”)与特定控制器方法(ProfileController.viewProfile)关联的最佳方式是什么?这是AngularJS的正确模

在我们公司,我们目前正在开发一个单页web应用程序。用户可以登录并用数据填充他们的个人资料,并与其他订阅者共享这些资料(这是一个社交网络应用程序)。 现在,我想象了这个模式:

  • 用户数据由UserService提供,使用RESTAPI恢复配置文件信息
  • 配置文件相关页面由唯一控制器(ProfileController)管理
我的问题是:将路由(比方说“查看配置文件”)与特定控制器方法(ProfileController.viewProfile)关联的最佳方式是什么?这是AngularJS的正确模式吗


谢谢

进一步调查后,我发现实现我想要的结果的最佳方法是在状态配置中使用resolve,如本文所述:

编辑: 我试着解释一下。我试图实现的是将特定的应用程序状态路由到控制器方法,以避免每次访问控制器时预加载大量数据子集。假设我在ui路由器中遇到这种情况

.state('view-profile', {
   url: '/view-profile',
   templateUrl: 'components/profile/profile.html',
   controller: 'ProfileController'
})
[...]
.state('edit-profile', {
   url: '/edit-profile',
   templateUrl: 'components/profile/edit-profile.html',
   controller: 'ProfileController'   
})
由于ProfileController可能会执行许多与编辑/查看无关的操作,因此我希望在导航到这些URL时设置要调用的特定控制器方法。 在其他MVC框架中,您可以将路由与特定的控制器方法相关联,因此

route: /edit-profile -> resolvesAs: ProfileController.editProfile(args)
不幸的是,在AngularJS 1.4中没有真正做到这一点的方法,至少没有使用ui路由器。
但幸运的是,我们可以在ui路由器配置上使用
resolve
属性,以避免为特定路由预加载无用数据。

进一步调查后,我发现实现所需结果的最佳方法是在状态配置中使用resolve,如本文所述:

编辑: 我试着解释一下。我试图实现的是将特定的应用程序状态路由到控制器方法,以避免每次访问控制器时预加载大量数据子集。假设我在ui路由器中遇到这种情况

.state('view-profile', {
   url: '/view-profile',
   templateUrl: 'components/profile/profile.html',
   controller: 'ProfileController'
})
[...]
.state('edit-profile', {
   url: '/edit-profile',
   templateUrl: 'components/profile/edit-profile.html',
   controller: 'ProfileController'   
})
由于ProfileController可能会执行许多与编辑/查看无关的操作,因此我希望在导航到这些URL时设置要调用的特定控制器方法。 在其他MVC框架中,您可以将路由与特定的控制器方法相关联,因此

route: /edit-profile -> resolvesAs: ProfileController.editProfile(args)
不幸的是,在AngularJS 1.4中没有真正做到这一点的方法,至少没有使用ui路由器。
但幸运的是,我们可以在ui路由器配置上使用
resolve
属性来避免预加载特定路由的无用数据。

在路由配置?@tymeJV中指定
controller
属性,我可以指定controller:ProfileController,而不是controller:ProfileController。someMethod(),这是你的意思吗?哦-控制器方法-错过了最后一部分。。。您不能真正将视图绑定到一个特定的方法…@tymeJV您是对的,但正如我下面回答中的链接所解释的,在状态配置中使用
resolve
可以获得相同的结果在路由配置中指定
controller
属性?@tymeJV因此,在状态提供程序配置中,我可以指定controller:ProfileController,而不是controller:ProfileController。someMethod(),这是你的意思吗?哦-控制器方法-错过了最后一部分。。。你不能将一个视图绑定到一个特定的方法上…@tymeJV你是对的,但正如我下面回答中的链接所解释的,在状态配置中使用
resolve
也可以达到同样的效果看起来你没有使用标准的ngRoute,但我认为即使是其他库也有resolve属性,因为我认为路线本身就是同一个物体。这将调用一个方法并将结果作为构造函数参数传递给控制器。请注意,如果您的控制器正在执行与视图无关的操作,这并不是一个很好的关注点分离。看起来您没有使用标准的ngRoute,但我认为即使是其他库也具有resolve属性,因为我认为路由本身是同一个对象。这将调用一个方法并将结果作为构造函数参数传递给控制器。请注意,如果您的控制器正在执行与视图无关的操作,那么这并不是一个很好的关注点分离。