Angular.JS:视图共享同一控制器,更改视图时模型数据重置

IT技术 javascript angularjs
2021-02-21 15:19:19

我开始使用 Angular.JS。

我有许多共享同一个控制器的视图。每个视图都是收集存储在控制器中的数据的一个步骤:

$routeProvider.when('/', {
  templateUrl: 'partials/text.html',
  controller: 'itemSubmitter'
});

$routeProvider.when('/nextThing', {
  templateUrl: 'partials/nextthing.html',
  controller: 'itemSubmitter'
});

itemSubmitter 控制器:

$scope.newitem = {
  text: null
}

这是第一个视图:

<textarea ng-model="newitem.text" placeholder="Enter some text"></textarea>

<p>Your text is:
{{ newitem.text }}</p>

这有效,实时更新“您的文字是:”段落。

但是,当加载下一个视图时,{{ newitem.text }}将重置为其默认值。如何使存储在控制器实例中的值跨视图持久化?

1个回答

控制器在改变路线时被处置。这是一种很好的行为,因为您不应该依赖控制器在视图之间传输数据。最好创建一个服务来处理该数据。

请参阅有关如何正确使用控制器的 angular 文档。 http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller

引用文档:

正确使用控制器

一般来说,控制器不应该尝试做太多事情。它应该只包含单个视图所需的业务逻辑。

保持控制器苗条的最常见方法是将不属于控制器的工作封装到服务中,然后通过依赖注入在控制器中使用这些服务。本指南的依赖注入服务部分对此进行了讨论。

不要将控制器用于:

  • 任何类型的 DOM 操作——控制器应该只包含业务逻辑。DOM 操作(应用程序的表示逻辑)以难以测试而著称。将任何表示逻辑放入控制器会显着影响业务逻辑的可测试性。Angular 为自动 DOM 操作提供数据绑定。如果您必须执行自己的手动 DOM 操作,请将表示逻辑封装在指令中。
  • 输入格式 — 改用有角度的表单控件。
  • 输出过滤——改用角度过滤器。
  • 要运行跨控制器共享的无状态或有状态代码——请改用角度服务。
  • 实例化或管理其他组件的生命周期(例如,创建服务实例)。
2021-04-25 15:19:19
谢谢@BArt,这正是我需要知道的。
2021-04-26 15:19:19
这是相当有趣的,这是公认的方法。我并不是要讨论理论和模式,但似乎每个视图一个控制器比传统的 MVC 模式更像是 MVVM 模式
2021-05-04 15:19:19
根据您引用的文档,angular 指出每个视图应该有一个控制器,这与许多典型的 MVC 类型方法背道而驰,例如 ASP.NET MVC
2021-05-09 15:19:19
@PW 该模式实际上与此无关。控制器根本不应该负责在视图之间保持/共享状态。
2021-05-14 15:19:19