AngularJS中的路由更改和控制器继承

Route changing and controller inheritance in AngularJS

本文关键字:控制器 继承 路由 AngularJS      更新时间:2023-09-26

我有两个问题:

  1. 我有一个表单。用户按下保存按钮后,会向服务器发出一个put请求。响应包含新对象的id。现在我想将路由从test.com/object更改为test.com/object/1。由于我已经掌握了所有信息,我不想再次运行控制器(这会再次从服务器加载对象,但这是无用的)短版本:如何在不重新加载控制器的情况下更改路线?如果这是不可能的,哪种方法是最好的

  2. 我有两个控制器,它们非常相似。一个很好的例子是createObject和editObject控制器。我想分享几乎所有的功能,但有一些控制器特定的方法不同。我喜欢服务,但在这种情况下,我看不到太大的优势,因为我不想只分享逻辑,我想分享事件处理程序本身的定义短版本:哪种方法可以为控制器创建继承

我期待着答案和好主意!非常感谢!

干杯

更改路线而不更改视图(或控制器)的典型(内置)角度方法是仅通过$location.search('someSearchParam', searchParamValue)更改URL的搜索部分。reloadOnSearch必须设置为false才能正常工作。当URL更改时,会广播事件$routeUpdate,因此您的控制器可以侦听此事件以了解某些内容已更改。另请参阅AngularJS分页$location.path但没有ngView重新加载

控制器继承可能不是一个好主意。您可以使用一个控制器和ng-show/hide来显示页面的"创建"或"编辑"版本,如$scope属性所示,例如$scope.editMode:

<div> 
  <span ng-show="editMode">Edit Object</span>
  <span ng-hide="editMode">Create Object</span>
</div>
<div>Name: <input type="text" ng-model="name"></div>
...
<div>
  <input type="submit" ng-show="editMode" ng-click="update()">Update
  <input type="submit" ng-show="editMode" ng-click="create()">Create
</div>

如果您确实想尝试控制器继承,请注意作用域是继承的,而不是控制器。控制器作用域原型通常从其父作用域继承。有关此主题的更多信息,请参阅AngularJS中范围原型/原型继承的细微差别是什么?

谢谢Mark,你帮了我很多!

路线变更并不能让我真正满意,但我认为这是目前唯一的办法。在我看来,应该可以在不重新加载任何控制器的情况下更改路线,而不仅仅是参数。希望这将在未来的版本中成为可能!