【问题标题】:AngularJS directive watch parent size changeAngularJS 指令监视父级大小变化
【发布时间】:2015-05-31 22:18:48
【问题描述】:

问题

我有一个简单的指令,可以对特定元素执行大小更新。这会监视窗口大小并进行相应调整。

MyApp.directive('resizeTest', ['$window', function($window) {
  return {
    restrict: 'AC',
    link: function(scope, element) {
      var w = angular.element($window);
      scope.$watch(function() {
        return { 'h': w.height(), 'w': w.width() };
      }, function(newValue, oldValue) {
        // resizing happens here
      }, true);
      w.bind('resize', function() { scope.$apply(); });
    }
  };
}]);

这很好用。

恰好在与之关联的div 标记内,我有一个孩子div。当父元素调整大小时,我想对子元素进行定位更改。但是,我无法触发触发器。

这在启动时被调用,但在调整元素大小或窗口更改时不会被触发:

MyApp.directive('centerVertical', ['$window', function($window) {
  return {
    restrict: 'AC',
    link: function(scope, element) {
      element.css({border: '1px solid #0000FF'});
      scope.$watch('data.overlaytype', function() {
        $window.setTimeout(function() {
          console.log('I am:      ' + element.width() + 'x' + element.height());
          console.log('Parent is: ' + element.parent().width() + 'x' + element.parent().height());
        }, 1);
      });
    }
  };
}]);

我应该使用什么类型的绑定或监视配置来检查父元素的大小调整?

小提琴

https://jsfiddle.net/rcy63v7t/1/

【问题讨论】:

  • 你有这方面的 plnkr/fiddle 吗?
  • 我会尝试设置一个。我还没有为 AngularJS 做过一个,所以这将是一次很好的体验。
  • 小提琴已添加。我注意到如果我注释掉第二个指令,第一个指令会再次起作用。

标签: javascript angularjs angular-directive


【解决方案1】:

您在centerVertical 指令中观察到的值data.overlaytype 不在scope 上,因此结果值为undefined,并且该值永远不会改变,这就是您不执行侦听器的原因。 要检查父元素的大小是否改变,您可以在 $watch 函数中检查它,如下所示:

scope.$watch(
    function () { 
        return {
           width: element.parent().width(),
           height: element.parent().height(),
        }
   },
   function () {}, //listener 
   true //deep watch
);

另外请记住,当你想使用一个已经存在的模块时,你不能这样称呼它angular.module('myModule', []),因为这意味着创建新模块。您只需传递模块名称angular.module('myModule'),这是您的代码不起作用的第二件事。

【讨论】:

  • 这不能按预期工作 - 调整窗口/浏览器大小时不会调用 $watch。
  • 这行得通,虽然手表只在摘要上触发。
  • @eln00b 另外,不要忘记 Angular 在注册时间 (!) 触发每个手表,所以如果你真的希望它在调整大小事件时触发 only,在你的监视处理程序添加:“if (newValue === oldValue) {return;}”以防止注册时间触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2016-01-25
  • 2023-04-04
相关资源
最近更新 更多