javascript - 如何以正确的方式在 Angular 应用程序中的 Controller 之间共享数据

标签 javascript angularjs

好吧,这似乎不是关于这个主题的第一个问题,但是......

我知道我们可以为此使用服务或事件,但是网上有很多帖子说我们不应该大量使用事件。

我也知道我们可以为此创建单独的服务,但在我看来,这也不太好。如何“观察”数据变化?如何通知 smth 已更改?事件?又是?...

还有每个变体的性能如何?

那么,在 Angular 应用程序中,在 Controller 之间共享数据的真正好处和可能是最佳方式究竟是什么?而且,做这件事是个好主意吗?这是否意味着我们的应用程序有问题,一些架构或概念问题?也许这有什么味道?

请指点我,给个好的建议

提前致谢

更新

这是最常见的问题,因为有时我必须这样做。我想知道它是否很好, Angular 原则是否正确?

最佳答案

一种方法是使用作用域继承:

angular.module('app', [])
.run(['$rootScope', function($rootScope){
  $rootScope.sharedObj = {search:''};
}])
.controller('navCtr',['$scope',function($scope){
}])
.controller('routeCtr',['$scope',function($scope){
  $scope.$watch("sharedObj.search",function(d){
    $scope.data = d ? 'Searched data is ' + d : '';
  });
}]);
.main div{
  display:inline-block;
  border:1px solid black;
  height:100px;
  vertical-align: top;
}

.navigation{
  width: 20%
}
.navigation input{
  max-width: 70%;
}

.page {
  width: 75%
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app" class="main">
  <div ng-controller="navCtr" class="navigation">
    search: <br/>
    <input ng-model="sharedObj.search"/>
  </div>
  <div ng-controller="routeCtr" class="page">
    {{data}}
  </div>
</div>

第二种方式是共享服务:

angular.module('app', [])
.factory('srcObject',[function(){
  return {
    value: ''
  }
}])
.controller('navCtr',['$scope', 'srcObject', function($scope, srcObject){
  $scope.search = srcObject;
}])
.controller('routeCtr',['$scope', 'srcObject', function($scope, srcObject){
  $scope.$watch(function(){return srcObject.value},function(d){
    $scope.data = d ? 'Searched data is ' + d : '';
  });
}]);
.main div{
  display:inline-block;
  border:1px solid black;
  height:100px;
  vertical-align: top;
}

.navigation{
  width: 20%
}
.navigation input{
  max-width: 70%;
}

.page {
  width: 75%
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app" class="main">
  <div ng-controller="navCtr" class="navigation">
    search: <br/>
    <input ng-model="search.value"/>
  </div>
  <div ng-controller="routeCtr" class="page">
    {{data}}
  </div>
</div>

关于javascript - 如何以正确的方式在 Angular 应用程序中的 Controller 之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34442752/

相关文章:

css - 如何使用 Angular 用户界面和 Bootstrap 将搜索表单放置在水平导航栏的中心

angularjs $http.post 导致 501 Unsupported method ('POST' )

html - 带有另一个表的表列

javascript - 什么时候可以调用对象原型(prototype)链上的方法?

JavaScript - Uncaught ReferenceError : google is not defined?

javascript - 使复选框磁贴可点击

angularjs - 在 chrome net::ERR_INSECURE_RESPONSE 中访问 localhost api 时出错

angularjs - 机器人 selenium2library 如何全局设置等待元素

javascript - 在 Angular 中使用 Parse Client Key 会出现 CORS 错误

javascript - 在 React 中向组件添加新输入并跟踪状态