从子控制器获取窗体状态到父控制器
Getting form state from child to parent controller
我是Angular的新手,我在父控制器和子控制器之间的通信方面遇到了困难。
jsfiddle在这里- http://jsfiddle.net/NEuJ6/35/
我正在做的是加载一个表单模板基于一个新的控制器路由。然而,父控制器有"保存并继续"按钮,我无法理解如何以子控制器(有效/无效状态)的形式将更改绑定到父控制器的按钮禁用状态。
简而言之,问题是在父控制器
中获取子控制器中表单的活动状态我相信,这可以通过$watch解决,但我不确定如何进行。
控制器<div ng-controller="MainCtrl">
<ul>
<li><a href="#/new">New User</a></li>
<li><a href="#/edit">Edit USer</a></li>
<li>To continue as guest, click on submit</li>
</ul>
<ng-view></ng-view>
<button ng-click="save()">Save and continue</button>
</div>
路线
app.config( function ( $routeProvider ) {
$routeProvider
.when('/edit', {
templateUrl: "form.html",
controller: "EditController"
})
.when('/new', {
templateUrl: "form.html",
controller: "NewController"
})
});
第二个问题是关于加载过程的下一步。当用户单击submit并且表单有效时,在这种情况下,我想用新模板更改ng视图。是下面的东西推荐(在控制器)?
if (form.$valid) {
location.path('/next')
}
或者我应该让继续按钮成为一个a
标签然后像
<a href="#/next" ng-click="validate()">Save and continue</a>
在这两种情况下,我都将添加一条新路由。
.when('/next', {
templateUrl: "next.html",
controller: "NextController"
})
没有内置的方法可以方便地从父控制器访问子控制器的状态。这也不是一个好的实践——父控制器不应该关心它有什么子控制器。
另一种方法很简单,这可能是最简单和最干净的方法:
- 让你的父控制器定义一个属性,根据它来启用/禁用按钮。
- 让任何子控制器根据其内部状态(例如表单的有效性状态)修改该属性。
注意,为了让子控制器原型地继承属性,而不是在本地覆盖它,它不需要是一个原语(更多信息在这里)。
例如:
/* In parent-controller */
$scope.buttonConfig = {enabled: false};
/* In child-controller */
$scope.$watch('form.$valid', function (newValue) {
$scope.buttonConfig.enabled = !!newValue;
});
这个<<p>看到,strong>修改演示。
<子>注意:
还有其他的选择(例如使用$rootScope
来存储应用程序范围的状态,使用服务在控制器之间共享数据,使用范围消息传递( $scope.$emit()
, $scope.$on()
)等)。 子>
如果你想在控制器之间通信,那么我认为推荐的方法是使用服务。
服务被同时注入父控制器和子控制器中,那么子控制器就可以调用服务的setter方法来存储服务中的数据,而父控制器可以连接到服务的getter方法来检索数据。
你不需要去创建你可以使用值提供者的服务。
这种模式的好处是你减少了两个控制器之间的耦合,它们不依赖于彼此或共享知识,它们只知道它们应该有一个服务来提供来自子控制器的信息,或者它们应该有一个服务来放置数据。
请参考有关提供商的angular文档以获取示例实现https://docs.angularjs.org/guide/providers
你的问题与这个问题密切相关/重复
在AngularJS中控制器之间通信的正确方式是什么?
最初的答案围绕着在angular中使用事件模型——broadcast/emit,虽然这种模式的问题在angular的当前版本中得到了解决,但我仍然不得不同意那些更喜欢基于服务的解决方案的人。
- 如何声明具有相同控制器的处于相同状态的多个模板
- 作用域变量未从状态父控制器继承到子控制器
- 在角度上不同控制器之间共享状态
- 更改控制器中ng重复中定义的变量的状态
- 如何将值与$scope绑定,以从定义状态ui路由器的控制器中使用ng模型进行查看
- AngularJS:控制器在使用UI路由器更改状态时多次注册
- Ember JS中控制器之间共享状态的正确方式
- UI 路由器 AngularJS 控制器无法使用状态
- 使用工厂时控制器/模板不共享相同的状态
- 如何在路由更改之间维护视图(控制器)状态
- 将状态参数传递给状态提供程序中设置的控制器
- AngularJS:使用不同的控制器保持不同视图之间的视图状态
- Jquery 序列化 :尝试在不提交表单的情况下将表单状态传递给 ASP.NET MVC 控制器
- HTTP 状态 500 - ..IllegalArgumentException:当我在 spring 控制器中使用 R
- 从服务器加载 html 和控制器并创建动态状态 UI - 路由器
- 如何在状态管理器视图控制器中传递已解析的依赖项
- 加载子状态时修改父控制器状态
- UI 路由器:更改状态时调用旧控制器
- 使用Angular ui路由器基于状态参数的负载控制器
- 刷新页面时保存控制器状态