【问题标题】:AngularJS CamelCase with bind and $apply explanationAngularJS CamelCase 与 bind 和 $apply 解释
【发布时间】:2015-09-03 10:58:22
【问题描述】:

我对指令比较陌生,我有这段代码,我从几个不同的来源拼凑而成。首先,我试图将指令更改为 CamelCase,因此指令的名称将类似于 myResize 但我似乎无法做到。我知道 angular 会进行规范化,所以我知道在我的 div 上它应该是 my-resize 而在我的指令上它应该是 myResize 但这不起作用?

另外,有人能解释一下 bind scope.$apply 函数在做什么吗?我认为当 scope.getWindowDimensions 发生变化时,单独的 $watch 会更新 scope.adjustForm,但显然情况并非如此。代码工作正常,我只是不知道为什么。

<div id='landingWrapper' ng-class='{"centerForm": adjustForm}' resize></div>

.directive('resize', function ($window) {
  return function (scope, element) {
    var w = angular.element($window);
    scope.getWindowDimensions = function () {
        return { 'h': w.height(), 'w': w.width() };
    };
    scope.$watch(scope.getWindowDimensions, function (newValue, oldValue) {
        var windowHeight = newValue.h;
        var formHeight = element[0].offsetHeight;
        if (formHeight > windowHeight) {
            scope.adjustForm = false;
        }
        else {
            scope.adjustForm = true;
        }
    }, true);
    w.bind('resize', function () {
        scope.$apply();
    });
  }
})

【问题讨论】:

  • scope.$apply() 更新你的绑定
  • 为什么 $watch 不会自动发生这种情况?当我在控制器而不是指令中使用 $watch 时,它似乎以这种方式工作?

标签: angularjs angularjs-directive


【解决方案1】:

你问了几件事:

  1. 在 JS 文件中定义指令时,应使用驼峰式 (myResize),而在 HTML 中应使用破折号 (my-resize)。如果它对您不起作用,则说明其他问题。
  2. 主 Angular 指令 (ng-app) 下的每个 DOM 元素都有一个范围。指令可能会或可能不会引入它们自己的隔离范围 - 即 - 只有在它们的树下的元素我们才会暴露给它们的变量的范围。这样,对某个元素的更改(例如值更改)不必传播到 DOM 中的所有元素(性能!!和内存!!),而只需传播到同一范围内的元素(您当然可以在范围之间共享变量)。由于这种机制,当范围发生任何更改时,Angular 可以通知范围内所有需要知道的内容已更改。但是 Angular 知道某些事情发生了变化的唯一方法是,如果 $digest() 循环已经开始($apply() 触发 $digest()),它会强制 angular 遍历所有“当前”范围并查看是否有什么东西发生了变化。改变了。
    (主要的 -)jQuery 本身(或任何非 Angular 框架)本身不会更新 Angular(调用 $digest()),因此您必须手动进行(通过调用 $apply()$digest() ) 每当 jQuery 上发生事件时。

【讨论】:

  • 1) 有 3 个地方使用了指令名称。在 HTML 和指令中两次。如果我在 HTML 中使用“my-resize”,然后在指令的两个地方都使用“myResize”,它就不起作用。但是,如果我在 HTML 中使用“my-resize”,然后在定义指令时使用“myResize”,然后在使用 w.bind() 时只使用“resize”,一切正常。那里到底发生了什么?
  • 2) 所以当被监视的变量发生变化时,指令中的 $watch 本身不会调用 $digest 循环吗?需要手动操作吗?这就是'w.bind'正在做的事情吗?它告诉 Angular 在 w 变化时执行 $apply?
  • 1) 为什么在指令(JS 文件)上只有一次.. 2) 这是一个示例:jsfiddle.net/j831wvz3 - 尝试调整窗口大小
  • 1) 我用这个小提琴作为参考开发了我的代码:jsfiddle.net/jaredwilli/SfJ8c - 这个代码写得不好?作者两次引用了指令名称。
  • 好的,我明白了。感谢您的信息。我很高兴接受你的回答。所以事件的名称在我的代码中实际上并不重要?我可以说 w.bind('flippyfloo'...) 可以吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 2023-03-11
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多