Page 111 - AngularJS权威教程
P. 111

10.5  ngModel   91


                  angular.module('myApp')                                                            1
                  .directive('myDirective',function(){
                      return {
                          require: '?ngModel',
                          link: function(scope, ele, attrs, ngModel) {                               2
                              if (!ngModel) return;
                              // 现在我们的指令中已经有ngModelController的一个实例
                          }                                                                          3
                      };
                  });
                                                                                                     4
                          如果不设置require选项,ngModelController就不会被注入到指令中。
                                                                                                     5
                  注意,这个指令没有隔离作用域。如果给这个指令设置隔离作用域,将导致内部ngModel无
              法更新外部ngModel的对应值:AngularJS会在本地作用域以外查询值。
                                                                                                     6
                  为了设置作用域中的视图值,需要调用ngModel.$setViewValue()函数。ngModel.$set
              ViewValue()函数可以接受一个参数。
                                                                                                     7
                  value(字符串):value参数是我们想要赋值给ngModel实例的实际值。这个方法会更新控
              制器上本地的$viewValue,然后将值传递给每一个$parser函数(包括验证器)。
                                                                                                     8
                  当值被解析,且$parser流水线中所有的函数都调用完成后,值会被赋给$modelValue属性,
              并且传递给指令中ng-model属性提供的表达式。
                                                                                                     9
                  最后,所有步骤都完成后,$viewChangeListeners中所有的监听器都会被调用。
                  注意,单独调用$setViewValue()不会唤起一个新的digest循环,因此如果想更新指令,需要
              在设置$viewValue后手动触发digest。                                                              10

                  $setViewValue()方法适合于在自定义指令中监听自定义事件(比如使用具有回调函数的                                     11
              jQuery插件),我们会希望在回调时设置$viewValue并执行digest循环。
                  angular.module('myApp')                                                            12
                  .directive('myDirective', function() {
                      return {
                          require: '?ngModel',
                          link: function(scope, ele, attrs, ngModel) {                               13
                              if (!ngModel) return;

                              $(function() {                                                         14
                                  ele.datepicker({
                                      onSelect: function(date) {
                                          // 设置视图和调用apply
                                          scope.$apply(function() {                                  15
                                              ngModel.$setViewValue(date);
                                          });
                                      }                                                              16
                                  });
                              });
                          }
                      };                                                                             17
                  });
                                                                                                     18
   106   107   108   109   110   111   112   113   114   115   116