36

我开始使用 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 }}会重置为其默认值。如何使存储在控制器实例中的值在视图中保持不变?

4

1 回答 1

68

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

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

引用文档:

正确使用控制器

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

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

不要将控制器用于:

  • 任何类型的 DOM 操作——控制器应该只包含业务逻辑。DOM 操作——应用程序的表示逻辑——以难以测试而闻名。将任何表示逻辑放入控制器会显着影响业务逻辑的可测试性。Angular 为自动 DOM 操作提供数据绑定。如果您必须执行自己的手动 DOM 操作,请将表示逻辑封装在指令中。
  • 输入格式 - 改用 Angular 表单控件。
  • 输出过滤 - 改用角度过滤器。
  • 要运行跨控制器共享的无状态或有状态代码——请改用 Angular 服务。
  • 实例化或管理其他组件的生命周期(例如,创建服务实例)。
于 2013-04-25T11:03:33.030 回答