GVKun编程网logo

angularjs – 如何在收到两个或更多$scope事件后调用函数?(angularjs scope 原理)

18

在本文中,我们将给您介绍关于angularjs–如何在收到两个或更多$scope事件后调用函数?的详细内容,并且为您解答angularjsscope原理的相关问题,此外,我们还将为您提供关于Angul

在本文中,我们将给您介绍关于angularjs – 如何在收到两个或更多$scope事件后调用函数?的详细内容,并且为您解答angularjs scope 原理的相关问题,此外,我们还将为您提供关于Angular 2 – 如何在兄弟组件中调用函数?、angularjs – Angular $scope.$digest vs $scope.$apply、angularjs – Angular $scope作为一个对象文字或多个$scope、angularjs – Angular Route – 加载时调用函数的知识。

本文目录一览:

angularjs – 如何在收到两个或更多$scope事件后调用函数?(angularjs scope 原理)

angularjs – 如何在收到两个或更多$scope事件后调用函数?(angularjs scope 原理)

例如,假设我需要在收到两个事件“eventA”和“eventB”后运行一个函数.我通常做的是为每个事件声明一个布尔变量,在接收到事件时将变量设置为true,并询问另一个变量是否为true来运行该函数:

var a = false,b = false;

$scope.$on("eventA",function(){
    a = true;
    if (b)
        performTask();
});

$scope.$on("eventB",function(){
    b = true;
    if (a)
        performTask();
});

var performTask = function() {
    /* do something... */
};

如果有三个或更多事件,这会变得更复杂.是否有设计模式来处理这些情况?

解决方法

你可以使用$q promises.

var dfdATask= $q.defer();
var dfdbTask= $q.defer();

$scope.$on("eventA",function(){
    // whatever this function does
    dfdATask.resolve(true);//or pass a value
});

$scope.$on("eventB",function(){
    //whatever this function does
    dfdbTask.resolve(true);//or pass a value
});

$q.all([dfdATask.promise,dfdbTask.promise]).then(function(){
    //be sure to pass in an array of promises
    //perform task
})

Angular 2 – 如何在兄弟组件中调用函数?

Angular 2 – 如何在兄弟组件中调用函数?

我有2个需要通信的兄弟组件: @H_301_5@

@H_301_5@< APP-控制>< / APP-控制>
 < APP-主>< / APP-主>

@H_301_5@app-controls包含需要在app-main组件中触发事件的按钮.是否有符合Angular 2风格指南的方式?

解决方法

您可以使用模板变量来获取对兄弟的引用.
如果< app-controls>有一个输出,当点击按钮时它会发出事件你可以这样做: @H_301_5@

@H_301_5@

<app-controls (buttonClicked)="main.doSomething($event)"></app-controls>
<app-main #main></app-main>
@H_301_5@或者您可以传递对@input()兄弟姐妹的引用;然后调用它上面的方法:

@H_301_5@

<app-controls [sibling]="main"></app-controls>
<app-main #main></app-main>

angularjs – Angular $scope.$digest vs $scope.$apply

angularjs – Angular $scope.$digest vs $scope.$apply

我只是想知道使用$digest热卖.在控制器内部,以下代码工作正常,并在3秒后更新DOM:
setTimeout(function(){
    $scope.$apply(function(){
    $scope.name = 'Alice';
    });
},3000);

但是通过使用

setTimeout(function(){
        $scope.$digest(function(){
        $scope.name = 'Alice';
        });
    },3000);

什么都没发生…

我以为他们做同样的事情.我错了什么?

$apply()和$digest()有一些相似之处和不同之处.它们之间的相似之处在于它们都会检查更改内容并更新UI并激活任何观察者.

两者之间的一个区别是如何调用它们. $digest()在没有任何参数的情况下被调用. $apply()接受一个在执行任何更新之前将执行的函数.

另一个区别是它们的影响. $digest()将更新当前范围和任何子范围. $apply()将更新每个范围.因此大多数时候$digest()将是您想要的并且更有效率.

解释为什么$apply()接受函数的最后一个区别是它们如何处理观察者中的异常. $apply()将异常传递给$exceptionHandler(在内部使用try-catch块),而$digest()将要求您自己处理异常.

angularjs – Angular $scope作为一个对象文字或多个$scope

angularjs – Angular $scope作为一个对象文字或多个$scope

假设我有以下控制器

angular.module('scopeExample',[])
    .controller('MyController',['$scope',function ($scope) {
        $scope.username = 'World';

        $scope.sayHello = function () {
            $scope.greeting = 'Hello ' + $scope.username + '!';
        };
}]);

有什么理由我不应该使用对象文字

angular.module('scopeExample',function ($scope) {
        $scope.viewmodel = {
            greeting: '',username: 'World',sayHello: function(){
                this.greeting = 'Hello ' + this.username + '!';
            }
        };
}]);

解决方法

您可以尝试使用此而不是$scope.
通过在视图中使用Controller As声明,您的视图中也会以点符号结束.

您的控制器代码最终可能如下所示:

angular.module('scopeExample',function () {
    var self = this;
    this.greeting = '';
    this.username = '';

    this.getName = function () {
        self.greeting = 'Hello ' + self.username + '!';
    };
}]);

在视图中使用Controller As声明将产生以下结果:

<div data-ng-controller="UserController as user">
       Hello {{ user.username }}
</div>

因此,在此示例中,您最终得到的代码较少,但您在视图中保留了点符号.

请注意,在Angular 1.2.0之前,Controller As功能不可用

angularjs – Angular Route – 加载时调用函数

angularjs – Angular Route – 加载时调用函数

我使用$routeProvider将我的所有应用程序页面路由到相关控制器,但是当两个路由使用相同的控制器(即/ blog& / blog:id)时,如何根据当前路由初始化单独的函数.

所以如果路由是/ blog我想在路由加载时初始化$scope.loadPosts().
如果路由是/ blog:id我想在路由加载时初始化$scope.loadPost($id).

你可以在这里做一些事情,但我的建议是通过路由解析来传递初始化函数.你可以这样做:
angular.module('test',['ngRoute'])
  .config(['$routeProvider',function($routeProvider) {
      $routeProvider
        .when('/blog',{
          controller: 'BlogController',template: '<h1>Blog</h1>',resolve: {
            init: function() {
              return function() {
                console.log('Loading Blog');
              }
            }
          }
        })
        .when('/blog/:id',template: '<h1>Blog ID</h1>',resolve: {
            init: function() {
              return function($route) {
                console.log('Loading Blog Article ' + $route.current.params.id);
              }
            }
          }
        });
    }
  ])
  .controller('BlogController',['$scope','$route','init',function($scope,$route,init) {
      init($route);
    }
  ]);
<!DOCTYPE html>
<html ng-app="test">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
  <script src="https://code.angularjs.org/1.4.6/angular-route.js"></script>

</head>

<body>
  <a href="#/blog">Go to Blog</a>
  <a href="#/blog/2">Go to Article 2</a>

  <div ng-view></div>
</body>

</html>

其他一些选择是:

>解决某些指示器,您可以在控制器内部的初始化函数中进行切换
>如果您正在加载博客路线,请解析未定义的对象,如果您正在加载blog:id route,请解析您为该路线加载的实际项目

希望这段代码能让您在任何决定的情况下开始正确的轨道.

编辑这里是一个link to a plunker,代码片段似乎间歇性地表现得很奇怪

今天的关于angularjs – 如何在收到两个或更多$scope事件后调用函数?angularjs scope 原理的分享已经结束,谢谢您的关注,如果想了解更多关于Angular 2 – 如何在兄弟组件中调用函数?、angularjs – Angular $scope.$digest vs $scope.$apply、angularjs – Angular $scope作为一个对象文字或多个$scope、angularjs – Angular Route – 加载时调用函数的相关知识,请在本站进行查询。

本文标签: