javascript - 在 AngularJS 1.6 中的兄弟组件之间交流更改
问题描述
我有一个 AngularJS 1.6 应用程序,如下所示:
angular.module('app').component('parent', {
template: '
<parent>
<display options="ctl.options"></display>
<controls options="ctl.options"></controls>
</parent>',
controller: function() {
this.options = { x: 100, y: 0.2 };
},
controllerAs: 'ctl',
bindToController: true
});
我想在controls
组件中使用输入来修改options
对象的属性,以便反映更改display
(但每次更改一个属性时都不会重写整个对象)。
我该怎么做?即使我将选项设置为双向绑定controls
,display
也不会更新并且$onChanges
不会触发。
它可以通过 $watch 或消息轻松完成,但我无法找到一种适当的以组件为中心的方式来完成它。
解决方案
一种声明式的方法是让工厂存储数据,并将工厂传递给每个控制器。当任一控制器/组件更新状态时,它将反映在另一个控制器/组件中。
var app = angular.module('app', []);
app.factory('Options', function(){
return {
data: {
x: 100,
y: 0.2
}
};
});
app.controller('DisplayCtrl', function($scope, Options){
$scope.options = Options.data;
});
app.controller('ControlsCtrl', function($scope, Options){
$scope.options = Options.data;
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
<div ng-controller="DisplayCtrl">
<p>x: {{ options.x }}</p>
<p>y: {{ options.y }}</p>
</div>
<div ng-controller="ControlsCtrl">
<label>
x: <input type="number" ng-model="options.x">
</label>
<label>
y: <input type="number" ng-model="options.y">
</label>
</div>
</div>
有关更多想法,请参阅在 AngularJS 控制器之间共享数据。我认为https://stackoverflow.com/a/25145593/1927876是最好的答案,因为它是如此声明性且易于推理,这也是我在这里回答的基础。
推荐阅读
- python-3.x - lambda 如何在排序的关键参数中工作?
- c# - ASP.NET Core 启动新线程并获取正确(旧 IHttpContextAccessor)以获取 ClaimsPrincipal(登录用户)
- symfony - 根据 dev 或 prod 环境加载 css
- openlayers - 为什么 MultilineString 图层不能正确显示
- javascript - 如何使用 chrome 扩展重新设计 Google 日历创建活动页面
- r - R 数值:精确或四舍五入的值
- angular - Meteor 1.6.1.1 Docker meteorInstall 未定义
- python - 使用python登录instagram
- python - 对连续矩阵中的许多数组执行高斯拟合并保存结果
- r - 使用gather和ggplot保持因子水平