首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从我的指令中,如何手动触发父作用域上的摘要周期?

从我的指令中,如何手动触发父作用域上的摘要周期?
EN

Stack Overflow用户
提问于 2015-08-04 15:26:15
回答 2查看 5.7K关注 0票数 2

我有一个指令,当以编程方式对底层模型进行更改时,我希望强制呈现。$scope.$apply是惯用的。但是,如果不反复单击UI (这可能是手动强制摘要),我无法获得要呈现的指令。

有人能帮我识别如何手动触发摘要吗?

即使是this.scope.$root.$apply()也没有效果。

但是,抓取父DOM节点并获取相关的作用域,然后从控制台调用$apply确实有效。

但是,在代码中使用此DOM节点方法时,它不起作用。为什么会这样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-05 00:41:28

有两件事要注意:

  1. 作用域相互继承,并形成树。作用域具有对$parent的引用,可用于遍历。
  2. 摘要周期是发生在作用域对象上的事情。即。$scope.$digest()。这将对作用域运行摘要,然后递归地对所有子作用域执行相同的操作。$scope.$apply()就像做$rootScope.$digest()一样。因为它是从根目录开始的,所以它调用了每个其他范围的摘要。所以$apply可能是过量的。

要回答您的问题,scope.$parent.$digest()将触发scope的父母的摘要。

但似乎引发文摘其实并不是你的问题。$apply将在所有作用域上触发摘要,所以如果这不适用于您,我不认为您的问题只是需要触发摘要。

也许您不需要整个指令来重新呈现,而只需要它的一部分来更新?如果是这样,请考虑将数据绑定到某些共享服务(如 )。

HTML

代码语言:javascript
代码运行次数:0
运行
复制
<div ng-app='app'>
  <one></one>
  <two></two>
</div>

JS

代码语言:javascript
代码运行次数:0
运行
复制
angular
  .module('app', [])
  .directive('one', function() {
    return {
      restrict: 'E',
      scope: {},
      template: "<input ng-model='shared.val'> {{ shared.val }}",
      controller: function($scope, Shared) {
        $scope.shared = Shared;
      }
    };
  })
  .directive('two', function() {
    return {
      restrict: 'E',
      scope: {},
      template: '<p> {{ shared.val }}</p>',
      controller: function($scope, Shared) {
        $scope.shared = Shared;
      }
    };
  })
  .factory('Shared', function() {
    return {
      val: ''
    };
  });
票数 4
EN

Stack Overflow用户

发布于 2015-08-04 17:57:37

这在某种程度上取决于。听起来,$parent就是你想要的名字。scope.$root只保存对$rootScope的引用(而不是父元素范围)。简短的回答-尝试以下..。

代码语言:javascript
代码运行次数:0
运行
复制
scope.$parent.$apply()

更长的答案-以上假设您的子指令作用域是通过scope: true从父继承的。有关主题和访问父作用域的其他可能方法的更多详细信息,请参见回答在AngularJS?在父作用域中获得句柄后,只需在其上调用$apply()即可。

我已经做了一个例子,它修改了jQuery .click()事件的父作用域。考虑以下情况并观察父母的行为..。

代码语言:javascript
代码运行次数:0
运行
复制
app.directive('parent', function() {
    return {
        link: function(scope, elem, attrs) {
             scope.value = 'parent'            
        }
    }
});

app.directive('child', function() {
    return {
        scope: true,
        link: function(scope, elem, attrs) {

            scope.value = 'child'

            elem.click(function() {
                scope.$parent.value = 'modded!!' // -- previously 'parent' 
                scope.$parent.$apply();
            })
        }
    }
});

JSFiddle链路 -工作示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31813267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档