首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ngModel及其使用方法

ngModel及其使用方法
EN

Stack Overflow用户
提问于 2015-04-09 23:41:26
回答 1查看 962关注 0票数 2

我刚从角度开始,并遇到了下面的指令。我已经读过一些教程,现在也正在阅读一些教程,但我真的不明白"require: ngModel“做什么,主要是因为我不知道ngModel总体上做什么。现在,如果我不是疯了,也是同一个指令提供了双向绑定( ctrl中的整个$scope.blah = " blah“,然后{blah}在由指令控制的html元素中显示'blah blah‘)。

这对我没什么帮助。此外,我不明白什么是“模型:@ngModel”。@ ngModel意味着父级作用域上的变量,但是ngModel并不是一个变量。

tl;dr:

  1. “需要: ngModel”做什么?
  2. “模型:@ngModel”做什么?

*auth是传递配置文件的dateFormat属性的服务(与q无关)

提前感谢您的帮助。

代码语言:javascript
复制
angular.module('app').directive('directiveDate', function($filter, auth) {

    return {
        require: 'ngModel',
        scope:  {
            model : '@ngModel',
            search: '=?search'
        },
        restrict: 'E',
        replace: true,
        template: '<span>{{ search }}</span>',
        link: function($scope) {

            $scope.set = function () {
                $scope.text = $filter('date')($scope.model, auth.profile.dateFormat );
                $scope.search = $scope.text;
            };

            $scope.$watch( function(){ return $scope.model; }, function () {
                $scope.set();
            }, true );

            //update if locale changes
            $scope.$on('$localeChangeSuccess', function () {
                $scope.set();
            });
        }
    };
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 03:06:52

ngModel是一个角度指令,负责数据绑定.通过它的控制器ngModelController,可以创建呈现和/或更新模型的指令。

看看下面的代码。这是一个非常简单的数字上下控制。它的工作是呈现模型,并在用户单击+-按钮时更新它。

代码语言:javascript
复制
app.directive('numberInput', function() {
  return {
    require: 'ngModel',
    restrict: 'E',
    template: '<span></span><button>+</button><button>-</button>',
    link: function(scope, element, attrs, ngModelCtrl) {
      var span = element.find('span'),
          plusButton = element.find('button').eq(0),
          minusButton = element.find('button').eq(1);

      ngModelCtrl.$render = function(value) {
        updateValue();
      };

      plusButton.on('click', function() {
        ngModelCtrl.$setViewValue(ngModelCtrl.$modelValue + 1);
        updateValue();
      });

      minusButton.on('click', function() {
        ngModelCtrl.$setViewValue(ngModelCtrl.$modelValue - 1);
        updateValue();
      });

      function updateValue(value) {
        span.html(ngModelCtrl.$modelValue);
      }
    }
  };
});

工作柱塞

由于它与模型交互,我们可以使用ngModelController。为此,我们使用require选项告诉角,我们希望它将控制器注入到link函数中,作为其第四个参数。现在,ngModelController有一个巨大API,我在这里不会详细介绍。对于这个例子,我们所需要的只是两个方法,$render$setViewValue,以及一个属性$modelValue

$render$setViewValue是同一条路的两条路。每次模型在其他地方发生变化时,都会以角的方式调用$render,这样指令就可以(重新)呈现它,并且每当用户做了应该改变模型值的事情时,这个指令就应该调用$setViewValue$modelValue是模型的当前值。代码的其余部分几乎是不言自明的。

最后,ngModelController有一个可以争论的缺点:它不能很好地处理“引用”类型(数组、对象等)。因此,如果您有一个绑定到某个数组的指令,并且该数组后来发生了更改(例如,添加了一个项),那么角将不会调用$render,并且该指令将不知道它应该更新模型表示。如果您的指令从数组中添加/移除一个项并调用$setViewValue:Angular不会更新模型,这也是一样的,因为它会认为什么都没有改变(尽管数组的内容已经改变了,但是它的引用保持不变)。

这应该能让你开始。我建议您阅读ngModelController文档关于指示的正式指南,以便更好地理解这一切是如何工作的。

P.S:您上面发布的指令根本没有使用ngModelController,所以require: 'ngModel'行是无用的。它只是访问ng-model属性以获得其值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29550909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档