AngularJS 使用笔记

编写一个 appEval 指令(类似早期版本的 ngInit )能够很好的实现“表现与逻辑分离”的思想,比如要渲染出三个内容规则的按钮,就可以这样:

p.input-object.text-right(data-app-eval="view_avaliableSendDays = ['今天', '明天', '后天']")
  button.button(
    type="button"
    data-ng-repeat=“view_day in view_avaliableSendDays"
    data-ng-class="{'button-positive': startDayOffset = $index}"
    data-ng-click="startDayOffset = $index"
  ) {{view_day}}

很显然, view_avaliableSendDays 是不适合在控制器里进行定义的,在模板里定义则显得比较合理

但是在模板里定义也会引起一些问题,比如在没有意识到的情况下控制器里的变量污染了视图里的变量名,或者正好相反

这种时候比较合适的做法就是给视图专有的变量名加上特殊的前缀,比如 view_ 这样子

appEval 的代码:

module.directive('appEval', [
  ->
    link: ($scope, $elem, attrs) ->
      $scope.$eval attrs.appEval
])

如果是在使用 Jade 的话,那么本着 “控制器里的嵌套 Scope 越少越好” 的原则,推荐使用迭代器来替换 ngRepeat

p.input-object.text-right
  each day, index in ['今天', '明天', '后天']
    button.button(
      type="button"
      data-ng-class="{'button-positive': startDayOffset === #{index}}"
      data-ng-click="startDayOffset = #{index}"
    )= day

不过即使如此, appEval 依旧是有用武之地的。比如说用来初始化某个控制器的变量:

p.input-object.text-right(data-app-eval="startDayOffset = 0")
  each day, index in ['今天', '明天', '后天']
    button.button(
      type="button"
      data-ng-class="{'button-positive': startDayOffset === #{index}}"
      data-ng-click="startDayOffset = #{index}"
    )= day

因为 offset 的值是由视图控制的,如果在控制器里设置了某个变量的默认值,那么当视图中的候选值调整后,控制器的代码也需要进行相应的调整。

如果把初始化默认值的代码放在视图中,维护起来会更加的便捷,而且不容易漏改。