对于想了解ajax–在angular.js中的控制器之间共享变量的读者,本文将提供新的信息,我们将详细介绍angularjs控制器与作用域的关系,并且为您提供关于Angular.js中控制器之间的传值
对于想了解ajax – 在angular.js中的控制器之间共享变量的读者,本文将提供新的信息,我们将详细介绍angularjs控制器与作用域的关系,并且为您提供关于Angular.js中控制器之间的传值详解、angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?、angularjs – 使用服务以角度在多个控制器之间共享ajax数据、angularjs – 在不同模块中的指令和控制器之间共享数据的有价值信息。
本文目录一览:- ajax – 在angular.js中的控制器之间共享变量(angularjs控制器与作用域的关系)
- Angular.js中控制器之间的传值详解
- angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?
- angularjs – 使用服务以角度在多个控制器之间共享ajax数据
- angularjs – 在不同模块中的指令和控制器之间共享数据
ajax – 在angular.js中的控制器之间共享变量(angularjs控制器与作用域的关系)
在Main.js中:
function MainCntl($scope) { ---code } function SearchCtrl($scope,$http) { $scope.url = 'http://10.0.0.13:9000/processAdHoc'; $scope.errorM = "No results"; $scope.search = function() { $http.post($scope.url,{ "data" : $scope.keywords}). success(function(data,status) { $scope.status = status; $scope.data = data; $scope.result = data; alert('yes'); }) . error(function(data,status) { $scope.data = data || "Request Failed"; $scope.status = status; alert('no'); $scope.result = "Failed"; }); }; }
在Index.html中
<body ng-controller="MainCntl" > ---code <div ng-controller="SearchCtrl"> <form> <div> <label for="tags"></label> <a ng-click="search()"><input type="image" src="../../images/search1.png"https://www.jb51.cc/tag/Box/" target="_blank">Box_submit" /></a> <input ng-model="keywords" placeholder="Shadow Search" id="tags"/> </div> </form> </div> ---code <p ng-model="result"> {{result}} </p> </body>
一切工作良好与ajax我发送数据和接收响应,我的问题如下:
在SearchCtrl函数中,我有一个名为$ scope.result的变量,稍后在Index.html中引用。如果我插入包含该变量的HTML代码到SearchCtrl控制器,它工作正常,但如果它是在MainCtrl控制器,它不工作。如何在控制器之间共享此变量。
先谢谢
例:
angular.module("yourAppName",[]).factory("myService",function(){ return {sharedobject: {data: null } } }); function MainCtrl($scope,myService) { $scope.myVar = myService.sharedobject; } function SearchCtrl($scope,$http,myService) { $scope.myVar = myService.sharedobject; }
在你的模板做:
{{myVar.data}}
See an example使用Angular v1.1.5
将它放在内部对象中的原因是保留引用,如果保持它没有“sharedobject”,并更改该对象,您的绑定将指向旧的引用,并且不会在模板中显示任何内容。
Angular.js中控制器之间的传值详解
前言
每个controller都会有自己的scope,所有的scope都是属于 $rootScope的子或者子的子...
那么问题就好解决了,通过 $rootScope.$broadcast
广播的事件每个controller都能收到事件
另外,我的经验是,尽量不要用event传数据。应该建立一个service来保存数据,并且设置相应getter/setter,具体如下:
每个controller依赖service,call service.setter(...)
统一的service.setter(...)
在改完数据后可以$emit('data-updated')
每个controller里$on('data-updated',function(){ $scope.data = service.getData() })
通过Angular的话可以通过下面四种方法
1、event
这里可以有两种方式,一种是$scope.$emit
,然后通过监听$rootScope的事件获取参数;另一种是$rootScope.$broadcast
,通过监听$scope的事件获取参数。
这两种方法在最新版本的Angular中已经没有性能区别了,主要就是事件发送的方向不同,可以按实际情况选择。
2、service
可以创建一个专用的事件Service,也可以按照业务逻辑切分,将数据存储在相应的Service中,因为已经有人提过了就不赘述了。
3、$rootScope
这个方法可能会比较dirty一点,胜在方便,也就是把数据存在$rootScope中,这样各个子$scope都可以调用,不过需要注意一下生命周期
4、直接使用$scope.$nextSibling及类似的属性
类似的还有$scope.$parent
。这个方法的缺点就更多了,官方不推荐使用任何$开头的属性,既增加了耦合,又需要处理异步的问题,而且scope的顺序也不是固定的。不推荐
另外就是通过本地存储、全局变量或者现代浏览器的postMessage来传递参数了,除非特殊情况,请避免这类方式。
直接建一个service,不要用什么事件,项目一大N多个controller或者N久再去维护会玩死你,service里提供存和取的方法,简单明了,API容易查找和修改,调试也方便无混乱的依赖关系
1、利用作用域的继承方式
由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域的值,不会影响父作用域上面的值;如果需要父作用域与子作用域共享一个值 的话,就需要用到后面一种,即作用域上的值为对象,任何一方的修改都能影响另一方,这是因为在js中对象都是引用类型。
基本类型
angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?
Sharing stateless or stateful code across Controllers — Use angular
services instead.
但这让我不确定.如何在控制器之间共享无状态/有状态代码?或者“代码”在这里意味着什么?一个模型?此外,据我所知,控制器不会互相引用.任何人都可以为我(其他人)解决问题吗?谢谢.
.factory("MyDataObject",function() { return {}; })
然后MyDataObject将是您调用它的任何对象,允许您将内容保存到其中,以便在控制器(或指令或其他服务等)之间共享数据,函数和状态.
你永远不会知道Angular文档,但我猜他们正在谈论的是:)
例如,请参阅此答案:Angularjs,passing scope between routes
angularjs – 使用服务以角度在多个控制器之间共享ajax数据
pqsAppModule.controller('NotificationBoxController',function($scope,items) { $scope.list = items.list(); })
和
pqsAppModule.controller('NotificationController',items) { $scope.list = items.list(); })
我需要创建一个“项目”服务,该服务将执行ajax请求并返回任何将注入它的控制器的数据.我希望,查询只进行一次,所有控制器之间共享项目.
pqsAppModule.factory('items',function($http) { var items = []; var itemsService = {}; $http.get('api/notification').then(function(response){ items = response.data; }); itemsService.list = function() { return items; }; return itemsService; });
但我不明白为什么angular发出请求并接收数据,但控制器中的所有项都是空的.
解决方法
(我只使用虚拟URL来通过异步方式加载数据)
HTML
<div ng-controller="NotificationBoxController"> <button ng-click="showMe();">press me</button> <pre>NotificationBoxController: {{items.getList()|json}}</pre> </div> <div ng-controller="NotificationController"> <pre>NotificationController: {{items.getList()|json}}</pre> </div>
JS
var pqsAppModule = angular.module('myApp',[]); pqsAppModule.controller('NotificationBoxController',items) { $scope.items = items; $scope.showMe= function(){ items.query(); } }); pqsAppModule.controller('NotificationController',items) { $scope.items = items; }); pqsAppModule.factory('items',function ($http) { var current = {}; var address = 'Singapore,SG,Singapore,153 Bukit Batok Street 1'; var URL = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + address + '&sensor=true'; var factory = { query: function () { var data = $http({method: 'GET',url:URL}).then(function (result) { current = result.data.results[0]; },function (result) { alert("Error: No data returned"); }); },getList: function () { return current; } } return factory; });
演示Fiddle
在这个例子中,我们从两个控制器的HTML中调用items.getList().但是如果我们想通过控制器更新模型,我们需要一个像$watch这样的监听器
angularjs – 在不同模块中的指令和控制器之间共享数据
每个联系人都可以有多个地址和电话号码.由于插入和编辑联系人在UI级别需要几乎相同的功能,因此我决定创建一个类似以下的指令来处理地址和电话:
地址:
(function () { var app = angular.module("AddressesEditorModule",[]); app.directive("addressesEditor",function () { return { restrict: "E",templateUrl: "/addressesEditorTemplate.html",controller: function ($scope) { this.addresses = [ // this will hold addresses. ]; // ... } } })();
电话:
(function () { var app = angular.module("PhonesEditorModule",[]); app.directive("phonesEditor",templateUrl: "/phonesEditorTemplate.html",controller: function ($scope) { this.phones = [ // this will hold phones. ]; // ... } } })();
我省略了在指令中声明的方法来处理地址和电话变量.
这两个指令在HTML中使用如下:
<div ng-app="ContactModule"> <div ng-controller="InsertController as insertCtrlr"> <!-- some other elements handling contact name goes here --> <addresses-editor></addresses-editor> <phones-editor></phones-editor> </div> </div>
这项工作完全符合我的预期,正确记录电话和地址.
现在,我想要做的是检索指令内的电话和地址,并将它们发送到服务器,以便记录在数据库的联系人.
我知道如何执行AJAX,但我不知道如何在指令和InsertController之间交换数据(带有我想要的数据的变量是:来自addressesEditor指令的this.addresses和来自phonesEditor指令的this.phones).
我怎么能做到这一点?
解决方法
为了说明如何完成,我使用服务创建了一些示例代码,以在控制器和指令之间共享数据:
app.factory('SharedService',function() { return { sharedobject: { value: '' } }; });
http://plnkr.co/edit/Q1VdKJP2tpvqqJL1LF6m?p=preview
希望有所帮助
今天关于ajax – 在angular.js中的控制器之间共享变量和angularjs控制器与作用域的关系的分享就到这里,希望大家有所收获,若想了解更多关于Angular.js中控制器之间的传值详解、angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?、angularjs – 使用服务以角度在多个控制器之间共享ajax数据、angularjs – 在不同模块中的指令和控制器之间共享数据等相关知识,可以在本站进行查询。
本文标签: