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

时间:2013-02-06 21:00:40

标签: javascript angularjs

我有两个问题:

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

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

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

    干杯

2 个答案:

答案 0 :(得分:2)

更改路线而不是视图(或控制器)的典型(内置)Angular方式是仅通过$location.search('someSearchParam', searchParamValue)更改网址的搜索部分。必须将reloadOnSearch设置为false才能使其正常工作。当URL更改时,将广播事件$routeUpdate,因此您的控制器可以侦听此事件以了解某些内容已更改。 另请参阅AngularJS Paging with $location.path but no ngView reload

控制器继承可能不是一个好主意。您可以使用一个控制器和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>

如果您确实想尝试控制器继承,请注意范围继承,而不是控制器。控制器范围原型继承自其父范围。有关此主题的更多信息,请参阅What are the nuances of scope prototypal / prototypical inheritance in AngularJS?

答案 1 :(得分:0)

谢谢马克,你帮助了我很多!

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