GVKun编程网logo

ajax – 在angular.js中的控制器之间共享变量(angularjs控制器与作用域的关系)

5

对于想了解ajax–在angular.js中的控制器之间共享变量的读者,本文将提供新的信息,我们将详细介绍angularjs控制器与作用域的关系,并且为您提供关于Angular.js中控制器之间的传值

对于想了解ajax – 在angular.js中的控制器之间共享变量的读者,本文将提供新的信息,我们将详细介绍angularjs控制器与作用域的关系,并且为您提供关于Angular.js中控制器之间的传值详解、angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?、angularjs – 使用服务以角度在多个控制器之间共享ajax数据、angularjs – 在不同模块中的指令和控制器之间共享数据的有价值信息。

本文目录一览:

ajax – 在angular.js中的控制器之间共享变量(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控制器,它不工作。如何在控制器之间共享此变量。

先谢谢

使用服务并将它注入到两个控制器,并将范围vars引用到服务变量。

例:

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中控制器之间的传值详解

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中对象都是引用类型。

基本类型

rush:js;"> function Sandcrawler($scope) { $scope.location = "Mos Eisley north"; $scope.move = function(newLocation) { $scope.location = newLocation; }}function Droid($scope) { $scope.sell = function(newLocation) { $scope.location = newLocation; }}// html
Location: {{location}}

angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?

angularjs – Angular docs:如何在控制器之间共享无状态/有状态代码?

正在阅读Angular.js’ Controller docs并偶然发现:

Sharing stateless or stateful code across Controllers — Use angular
services instead.

但这让我不确定.如何在控制器之间共享无状态/有状态代码?或者“代码”在这里意味着什么?一个模型?此外,据我所知,控制器不会互相引用.任何人都可以为我(其他人)解决问题吗?谢谢.

我认为他们所指的可能是“持久化”数据,在控制器之间或路由变化之间共享数据的方法之一.一种方法是将它放在rootScope中,另一种方法是使用服务.如果您定义这样的服务:
.factory("MyDataObject",function() {
    return {};
})

然后MyDataObject将是您调用它的任何对象,允许您将内容保存到其中,以便在控制器(或指令或其他服务等)之间共享数据,函数和状态.

你永远不会知道Angular文档,但我猜他们正在谈论的是:)

例如,请参阅此答案:Angularjs,passing scope between routes

angularjs – 使用服务以角度在多个控制器之间共享ajax数据

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 – 在不同模块中的指令和控制器之间共享数据

angularjs – 在不同模块中的指令和控制器之间共享数据

我已经和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 – 在不同模块中的指令和控制器之间共享数据等相关知识,可以在本站进行查询。

本文标签:

上一篇Laravel 视图中AJAX请求、jquery-ujs异步使用DELETE请求时配置X-CSRF-TOKEN

下一篇AJAX数据格式之JSON(ajax json格式)