当前位置: 首页 > 面试题库 >

AngularJS触发并监视控制器中服务中的对象值更改

崔绍辉
2023-03-14
问题内容

我正在尝试监视控制器中服务的更改。我在这里基于stackoverflow的许多qns尝试了各种方法,但是我一直无法使其工作。

的HTML:

<div ng-app="myApp">
    <div ng-controller="MyCtrl">
        <div ng-click="setFTag()">Click Me</div>
    </div> 
</div>

javascript:

var myApp = angular.module('myApp',[]);

myApp.service('myService', function() {
    this.tags = {
        a: true,
        b: true
    };


    this.setFalseTag = function() {
        alert("Within myService->setFalseTag");
        this.tags.a = false;
        this.tags.b = false;

        //how do I get the watch in MyCtrl to be triggered?
    };
});


myApp.controller('MyCtrl', function($scope, myService) {

    $scope.setFTag = function() {
        alert("Within MyCtrl->setFTag");
        myService.setFalseTag();
    };

    $scope.$watch(myService.tags, function(newVal, oldVal) {
        alert("Inside watch");
        console.log(newVal);
        console.log(oldVal);
    }, true);

});

如何使手表在控制器中触发?

jsfiddle


问题答案:

尝试$watch通过这种方式写:

myApp.controller('MyCtrl', function($scope, myService) {


    $scope.setFTag = function() {
       myService.setFalseTag();
    };

    $scope.$watch(function () {
       return myService.tags;
     },                       
      function(newVal, oldVal) {
        /*...*/
    }, true);

});

演示版 **[Fiddle](http://jsfiddle.net/b3A8B/5/)**

[编辑]

有时,这种方式将不起作用,特别是如果服务已从3d party更新。

为了使其工作,我们必须 帮助 调整点火消化周期。

这是一个例子:

在服务端,当我们想要更新tags值时,请输入以下内容:

if($rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest'){
   $rootScope.$apply(function() {
     self.tags = true;
   });
 }
 else {
   self.tags = true;
  }


 类似资料:
  • 问题内容: 我创建了一个服务来隔离业务逻辑,并将其注入需要信息的控制器中。我最终要做的是让控制器能够监视服务中的值,这样我就不必进行广播/通知或复杂的消息传递解决方案,就可以将所有控制器的数据更改通知给控制器。服务。 我创建了一个plnkr,展示了我要执行的操作的基本概念。 http://plnkr.co/edit/oL6AhHq2BBeGCLhAHX0K?p=preview 可以让控制器监视服务

  • 问题内容: 我想触发一个包含jQuery指令的AngularJS自定义指令。如何做呢?我已经在指令中阅读了关于发射功能的信息? 想法? 问题答案: 您可以使用服务在控制器和指令之间进行通信。 服务可能如下所示: 该指令可以响应服务: 只需将我所做的替换为jQuery操作,您就应该拥有所需的东西。 这是一个有效的小提琴:http : //jsfiddle.net/jeremylikness/wqXY

  • 问题内容: 我已经阅读了几篇有关angularjs实体正确用法的文章:服务,工厂,控制器和指令。 我特别关心的是控制器和服务的比较。但是,没有一个帖子告诉我什么是控制器可以执行服务不能执行的操作,反之亦然。 可以列出它吗?或者仅仅是在angular的用法上规范? 问题答案: 控制器 通常用于绑定视图。控制器管理视图的生命周期,应将其视为视图控制器。将为视图的每个实例创建一个新的控制器,这意味着,如

  • 在Vue.js中,我有三个模板,它们应该一起工作以触发加载新结果。我的容器模板是一个包含过滤器和结果模板的通用模板。当过滤器模板中的对象发生更改时,我很难在结果模板中触发更改。流程非常简单。以下是我目前的情况以及流程的工作原理: 筛选模板:单击后,我的对象属性将更新为新值,并将此更改发送到容器模板。 容器模板:-此角色仅用于保存筛选器和结果模板,并将修改后的对象传递给结果模板。 结果模板:

  • 问题内容: 我正在使用socket.io在我的应用中启用聊天功能,并且正在使用一项服务来执行所有套接字操作。当出现消息时,我想从服务中触发控制器的功能以在UI中进行一些更改。所以我想知道如何从服务访问控制器的功能。样例代码: 这是服务的示例代码。 现在控制器的代码 问题答案: 您可以通过使用角度事件或来实现此目的。 在您的情况下会有所帮助,您需要广播事件,以便具有相同事件名称的所有子作用域都可以监

  • 问题内容: 是否可以实现类似以下触发器的内容 但是在整个服务器上。我的想法是捕获服务器中所有数据库之间的所有架构更改。 就即时消息而言,这在SQL Server 2005中是不可能的,但是我想知道是否有人能像这样工作。我想避免必须在每个数据库中实现触发器。 问题答案: 是的,SQL Server 2005引入了“ DDL触发器”,请在SQL Team 上阅读一篇出色的文章。 本文很好地显示了它们是