$watch 一个服务变量或者 $broadcast 一个带有 AngularJS 的事件

2024-01-06

我正在使用一项服务在控制器之间共享数据。当变量被修改时,应用程序必须更新 DOM。我找到了两种方法来做到这一点,您可以在此处查看代码:

http://jsfiddle.net/sosegon/9x4N3/7/ http://jsfiddle.net/sosegon/9x4N3/7/

myApp.controller( "ctrl1", [ "$scope", "myService", function( $scope, myService ){
    $scope.init = function(){
        $scope.myVariable = myService.myVariable;
    };
}]);
myApp.controller( "ctrl2", [ "$scope", "myService", function( $scope, myService ){
    $scope.increaseVal = function(){
        var a = myService.myVariable.value;
        myService.myVariable.value = a + 1;
    };
}]);

http://jsfiddle.net/sosegon/Y93Wn/3/ http://jsfiddle.net/sosegon/Y93Wn/3/

myApp.controller( "ctrl1", [ "$scope", "myService", function( $scope, myService ){
    $scope.init = function(){
        $scope.increasedCounter = 1;
        $scope.myVariable = myService.myVariable;
    };
    $scope.$on( "increased", function(){
        $scope.increasedCounter += 1;
    }
}]);
myApp.controller( "ctrl2", [ "$scope", "myService", function( $scope, myService ){
    $scope.increaseVal = function(){
        myService.increaseVal();
    };
}]);

在第一种情况下,我与控制器共享服务中的一个变量,并在指令中 $watch 它。在这里,我可以直接在此控制器或共享它的任何其他控制器中修改变量,并且更新 DOM。

在另一个选项中,我使用服务中的函数来修改 $broadcast 事件的变量。该事件由控制器监听,然后更新 DOM。

我想知道哪种选择更好以及原因。

Thanks.

EDIT:

jsFiddle中的代码是真实代码的简化版本,具有更多的对象和功能。在服务中,myVariable 的 value 字段实际上是一个对象,它的信息量比原始类型要多得多;该信息必须在 DOM 中显示和更新。对象 myVariable.value 在每次更改中设置:

myVariable.value = newValue;

当这种情况发生时,所有 DOM 元素都必须更新。由于 myVariable.value 中包含的信息是可变的,属性的数量会发生变化(我不能使用数组),因此删除 DOM 元素并创建新元素要容易得多,这就是我在指令中所做的(但是实际代码中包含更多元素):

scope.$watch( "myVariable.value", function( newVal, oldVal ){

            if( newVal === oldVal ){

                return;

            }

            while( element[0].children.length > 0 ){

                element[0].removeChild( element[0].firstChild );

            }


            var e = angular.element( element );
            e.append( "<span>Value is: " + scope.myVariable.value + "</span>" );

        } );

您的代码过于复杂。我不确定你想用该指令做什么。

你不必$watch nor $broadcast任何事物。

您的服务中有一个具有原语的对象。在 ctrl1 中,您将对象分配给$scope(这很好,因为如果我们将它分配给原语,它将需要一个$watch肯定如所见here http://angular-tips.com/blog/2013/08/consuming-services/.

到目前为止,一切都很好。要增加价值,有一个简单的方法:myVal++不需要临时变量。

对于该指令,我不确定您的目标是什么,我将其简化为您需要使该示例发挥作用的内容。你不需要$watch nor $broadcast. ctrl1知道所做的改变myVariable对象,因此如果它发生变化,您会注意到它。

Code:

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

myApp.provider( "myService", function(){

    var myVariable = {
        value: 0
    };
    this.$get = function(){
        return {
            myVariable: myVariable,
            increase: function() {
                myVariable.value++;
            }
        };
    };
});

myApp.directive( "dir1", function(){
    return {
        restrict: 'EA',
        template: '<div>value: {{myVariable.value}}</div>',
        replace: true
    };
});


myApp.controller("ctrl1", ["$scope", "myService", function($scope, myService){
    $scope.myVariable = myService.myVariable;
}]);

myApp.controller( "ctrl2", [ "$scope", "myService", function( $scope, myService ){
    $scope.increaseVal = myService.increase;
}]);

View:

<body ng-app = "myApp">
    <div dir1="myVariable.value" ng-controller = "ctrl1">
    </div>

    <div ng-controller = "ctrl2">
        <button ng-click = "increaseVal()">
            Increase
        </button>
    </div>


</body>

这是我的叉子小提琴:http://jsfiddle.net/uWdUJ/ http://jsfiddle.net/uWdUJ/同样的想法稍微干净一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

$watch 一个服务变量或者 $broadcast 一个带有 AngularJS 的事件 的相关文章

  • 用角度js中的字母过滤列表

    我在表格中显示了一个列表 我需要使用名称的第一个字母来过滤结果 在列表上方我有一个字母 A B C D 等等 单击后 字母列表将按名字过滤 例如 列表详细信息是Apple Boy Bridge点击后A Apple将显示 我必须过滤国家名称以
  • 在 for 循环中突破 Promise 块

    我有以下代码 this storeNameValidate function stores var deferred q defer console log stores for storeIndex in stores this name
  • 如何并排展开和折叠三个div?

    document ready function toggle click function if this data name show sidebar animate width 10 hide map animate width 89
  • 在 Angularjs 中格式化输入值

    我正在尝试编写一个指令 自动格式化数字
  • AngularJS 中的非单例服务

    AngularJS 在其文档中明确指出服务是单例 AngularJS services are singletons 违反直觉的是 module factory还返回一个 Singleton 实例 鉴于非单例服务有很多用例 实现工厂方法以返
  • Angularjs 抛出 TypeError:无法读取未定义的属性“indexOf”

    我正在尝试调试上面的代码 我觉得这非常有用 gt 我什至找不到代码中的问题 也不知道从哪里开始 因为 Angularjs 对我来说仍然很新 我正在尝试本地化 Angularjs 应用程序 我知道为了获得帮助而缺少很多上下文 但我正在尝试查看
  • 在 Angular ui-router 中更改状态而不更改浏览器历史记录

    假设我们有这样的逻辑 从状态A改变到状态B 每当我们到达状态 B 时 应用程序总是通过调用将我们重定向到状态 C state go stateC 现在我们处于状态C 我的问题是如何从状态 C 返回状态 A 考虑到状态 A 可以是我们在运行时
  • 如何使用 ng-if 测试变量是否已定义

    有没有办法使用ng if测试变量是否已定义 而不仅仅是它是否为真 在下面的示例中 现场演示 http plnkr co edit jKPN0dOHDWBtPxJHXv2R p preview HTML 仅显示红色商品的运费 因为item s
  • 如何在 Angular 中使用 ng-options 过滤选择?

    我编写了以下 Angular 应用程序的概念验证 该应用程序允许人们投票选举美国总统
  • 如何使用 $http.get 获取 304 状态代码?

    如何使用 http get 获取 304 状态代码 http get menu json success function data status headers scope menu data console log status sho
  • 将行推入使用 ng-repeat 以角度呈现的表格中

    当客户端单击该行时 我想在表中插入额外的行 不应预取数据 因为我预计最多有 30 行 但每行都有关联的数据 在一次获取中获取这些数据是不合理的 到目前为止 我的方法是使用 ng repeat 迭代我的集合并渲染表格 当客户端按下该行时 客户
  • 为什么在这个函数定义中像这样使用“window.angular”?

    我正在尝试理解一个我需要用来与 Django 集成的 angularjs 文件 它有一个我不熟悉的奇怪语法 请记住我是一名初级开发人员 所以这可能是你的面包和黄油 它是这样的 function angular undefined use s
  • 选择器的内部文本

    我尝试从此标记中获取内部文本 span class ng binding ng scope Displaying results 1 25 of 17 430 span 使用此选择器 document querySelectorAll di
  • Angularjs 模式的复选框表现得很奇怪

    我有一个有角度的应用程序plunker http plnkr co edit rac8w9g8L0eX8mlXKuVn p preview 当我们单击该按钮时 它会打开一个包含项目列表的模式对话框 其中 2 项是根据复选框表输入中的条件进行
  • 单元测试依赖注入

    我对茉莉花和业力是全新的 我相信我的环境设置正确 并且我能够运行非常基本的单元测试 但是一旦我尝试实例化控制器 我就会收到未知提供程序错误 并且我不确定如何调试它 我需要传入 stateProvider 依赖项吗 我在角种子示例中没有看到这
  • 从指令动态地将角度属性添加到元素

    我正在尝试构建一个指令来更改缓慢的 ajax 调用按钮上的加载状态 基本上 这个想法是为按钮元素设置一个属性 ng loading 并让指令添加其余的内容 这是html代码
  • 如何在量角器中模拟拖放动作?

    我有一个双滑块 我想测试它是否可操作并返回正确的数据 滑块有一个最小和一个最大处理程序 它还有一些 我可以挂钩的断点 我想要模拟的是 handler max 元素的 touchStart 将拇指移动到类为 step 3 的元素上 handl
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • 在 Angular 中让多个调用等待同一个 Promise

    我在一个页面上有多个使用相同服务的控制器 为了举例 我们将服务称为 USER 第一次调用 USER getUser 时 它会发出 http 请求来获取有关用户的数据 调用完成后 它将数据存储在 USER data 中 如果再次调用 USER

随机推荐

  • 如何确定电子邮件地址是 Microsoft“工作或学校”帐户还是 Microsoft 帐户

    我想在 Azure 多租户环境中对 Microsoft 帐户和 工作或学校 帐户进行身份验证 每种身份验证类型需要不同的请求 如果我尝试针对 工作或学校 请求以 Microsoft 帐户身份登录 则登录将在 Microsoft 登录时失败
  • 在 api 27、28、29 中混淆应用程序时,工作管理器不会运行

    我有一个每 15 分钟运行一次的定期任务 当混淆应用程序时 如果应用程序从后台被终止 工作管理器将不起作用 测试设备 一加7T 诺基亚5 Google Pixel 2模拟器 仅当应用程序位于前台或后台时 工作管理器才会执行 禁用 progu
  • 如何在混合(C#/C++)调试中设置数据断点?

    我用 C 启动程序 然后调用一些非托管 C 当我在非托管 C 中中断一行时 新数据断点 菜单项呈灰色 有没有办法解决 所以要做到这一点我必须 将非托管dll设置为启动项目 将托管程序设置为启动命令 将调试模式设置为Native 中断执行 或
  • 使用有关 WooCommerce 用户创建的生成密码发送电子邮件通知

    在 WooCommerce 中 使用下面的代码我创建新的 WP User 其中随机密码并将用户角色设置为 客户 我想在购买时自动创建帐户 然后我用WC Emails将登录详细信息发送给买家 在这种情况下 我需要纯密码 但我真的不知道为什么附
  • 如何锁定 SVN 主干(除了来自分支的合并)?

    我想阻止开发人员直接在主干上工作 我的目标是强制所有开发人员离开主干并在自己的分支上工作 直到 CI 测试通过 然后 他们必须从主干合并到分支 以获取最新更改 运行并通过测试 然后再合并回主干 这种 SVN 使用方式有什么规则吗 限制主干提
  • “grep”命令的退出状态代码

    The grep http linux die net man 1 grep手动在退出状态部分报告 EXIT STATUS The exit status is 0 if selected lines are found and 1 if
  • CTE 的意外结果

    我创建了一个使用多个 CTE 的复杂流程 主要用于递归分层工作 在小样本数据集上 一切都按预期进行 但是当我将代码应用于大数据集时 我收到了意外 且错误 的结果 我想我已经将范围缩小到了 CTE 递归 CTE 是在几个早期 CTE 中处理的
  • 在 Datalab 中查询 Hive 表时出现问题

    我已经创建了一个 dataproc 集群 其中包含更新的 init 操作来安装 datalab 一切正常 除了当我从 Datalab 笔记本查询 Hive 表时 我遇到了 hc sql select from invoices limit
  • Chrome 扩展:点击编辑当前网址,然后重定向到编辑后的网址

    我是一名心理学学生 我经常阅读论文 大学图书馆提供数据库的访问 但我每次都需要使用图书馆搜索引擎并登录 很烦人 我找到了一种避免跳转页面的方法 方法如下 我在Google Scholar中找到一篇论文后 在目标数据库地址末尾添加 ezp l
  • Symfony2 SonataAdminBundle 密码字段加密

    我有 FOSUserBundle 来管理我的用户 SonataAdminBundle 来管理我的网站 我有一个问题 每当我尝试更改 添加任何用户的密码时 密码都不会编码到sha512 但是当用户在 fosuserbundle 注册页面中注册
  • SQLite查询:获取一行的所有列(android)?

    这是架构 SQL查询是 从unjdat中选择 其中col 1 myWord 即 我想显示 col 1 为的行的所有列myWord int i String temp words new ArrayList
  • 如何使用正则表达式将缩写与其含义相匹配?

    我正在寻找与以下字符串匹配的正则表达式模式 一些示例文本 SET 演示了我正在寻找的内容 能源系统模型 ESM 用于寻找特定的最佳值 SCO 有人说计算机系统 CUST 很酷 夏天应该首选户外比赛 OUTS 我的目标是匹配以下内容 Some
  • 使用函数触发 chrome.browserAction.onClicked

    我想触发点击 以下代码正在侦听 chrome browserAction onClicked addListener function tab 原因是我有一个工作扩展 它正在后台脚本 上面的 addListener 中监听并在单击时执行一些
  • JavaScript 数组迭代返回多个值

    这太简单了 我感到困惑 我有以下内容 var x shrimp var stypes new Array shrimp crabs oysters fin fish crawfish alligator for t in stypes if
  • 动态改变任务重试次数

    重试任务可能毫无意义 例如 如果任务是传感器 并且由于凭据无效而失败 那么以后的任何重试都将不可避免地失败 如何定义可以决定重试是否合理的操作员 在 Airflow 1 10 6 中 决定任务是否应该重试的逻辑位于airflow model
  • SQLite 连接未出现在实体数据模型向导中(vs2015)

    我所做的是 1 在vs2015 Net Framework 4 6 中创建一个项目 2 从Nuget安装System Data SQLite 实际上是System Data SQLite 1 0 105 1 System Data SQLi
  • Spring JDBC 和 Firebird 数据库

    有没有人actually将 Firebird 2 1 与 Spring JDBC 一起使用 出于测试目的 我在 MySQL Postgres 和 Firebird 中设置了三个简单的单表数据库 我在连接 MySQL 或 Postgres 并
  • xml 中的 Android xml 引用不起作用

    我想将新的材料设计应用到我的 Android 应用程序中 但我的 xml 文件有一个小问题
  • 在SearchView中处理物理键盘的Enter键

    我在我的应用程序中实现了一个 SearchView 当我使用软键盘 使用查询文本监听器 https developer android com reference android widget SearchView OnQueryTextL
  • $watch 一个服务变量或者 $broadcast 一个带有 AngularJS 的事件

    我正在使用一项服务在控制器之间共享数据 当变量被修改时 应用程序必须更新 DOM 我找到了两种方法来做到这一点 您可以在此处查看代码 http jsfiddle net sosegon 9x4N3 7 http jsfiddle net s