带有bind和$ apply解释的AngularJS CamelCase

时间:2015-09-03 10:58:22

标签: angularjs angularjs-directive

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

另外,有人可以解释一下绑定范围究竟是什么。$ 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();
    });
  }
})

1 个答案:

答案 0 :(得分:2)

你问了几件事:

  1. 在JS文件中定义指令时,应使用驼峰式(myResize),而在HTML上则应使用短划线(my-resize)。如果它不适合你,那么别的东西就错了。
  2. 主角度指令(ng-app)下的每个DOM元素都有一个范围。指令可能会或可能不会引入它们自己的孤立范围 - 即 - 范围,只有它们树下的元素才会暴露给它们的变量。这样,某个元素的变化(例如值变化)不必传播到DOM中的所有元素(性能!!和内存!!),而只是传播到同一个元素上的元素。范围(您当然可以在范围之间共享变量)。由于这种机制,当在作用域上发生任何更改时,angular可以通知所有需要在作用域上知道某些内容已被更改。但是角度知道某些东西已经改变的唯一方法是,如果$ digest()循环已经开始($apply()触发$digest()),这会强制角度通过所有&#34;当前& #34;范围,看看是否有变化。
    (主要的 - )jQuery本身(或任何非角度框架),不会本地更新角度(调用$ digest()),因此你必须手动(通过调用$apply()或者$digest())只要jQuery发生了一个事件。