AngularJS ng-model-options getter-setter

use*_*436 20 getter-setter angularjs

我刚刚升级到1.3.8角度版.

当使用1.2.23版本时,我创建了一个指令,将数据表单视图转换为模型,反之亦然.

这是我的指示:

.directive('dateConverter', ['$filter', function ($filter) {

    return {

        require: 'ngModel',

        link: function (scope, element, attrs, ngModelController) {

            // Convert from view to model
            ngModelController.$parsers.push(function (value) {
                return $filter('date')(new Date(date), 'yyyy-MM-ddTHH:mm:ss')
            });

            // Convert from model to view
            ngModelController.$formatters.push(function (datetime) {
                return $filter('date')(datetime, 'MM/dd/yyyy');
            });
        }
    };
}]);
Run Code Online (Sandbox Code Playgroud)

});

我看到这里是getter和setter方法在结合现在都支持,但我不能在任何地方如何使用发现两者的getter setter方法.有什么办法吗?那是 - 可以用ng-model-options替换我的转换指令吗?

谢谢

Dra*_*usu 40

文档似乎有点模糊,但使用非常简单.你需要做什么:

  1. HTML:

    <input ng-model="pageModel.myGetterSetterFunc"
    ng-model-options=" {getterSetter: true }">
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在JS控制器中,如果没有发送参数,则创建一个将返回值(+ apply stripping)的函数,而不是实际模型,如果发送参数,则会更新模型(+应用其他更改).

getter/setter基本上是视图值和模型值之间的另一个"层".

例:

$scope.pageModel.firstName = '';
$scope.pageModel.myGetterSetterFunc: function (value) {
  if (angular.isDefined(value)) {
    $scope.pageModel.firstName = value + '...';
  } else {        
    return $scope.pageModel.firstName.substr(0,
      $scope.pageModel.firstName.lastIndexOf('...')
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

DEMO PLUNKER:http://plnkr.co/edit/Zyzg6hLMLlOBdjeW4TO0?p=preview

(检查控制台 - http://screencast.com/t/3SlMyGnscl)

注意:看看如何在可重用性方面进行扩展将会很有趣.我建议将这些getter/setter创建为外部化的可重用方法,并为它们创建生成器(因为每种情况的数据模型都不同).并且在控制器中只调用那些发生器.只需2美分.

  • 您可能想使用`arguments.length`而不是`isDefined` - 请参阅https://github.com/angular/angular.js/issues/11361(gkalpak的评论). (4认同)

Ger*_*ied 5

这个问题相当老了 - 但对于 IE9+ (当然还有所有其他相关浏览器),您可以使用 ECMAScript 5 getter/setter 方法,我更喜欢使用 ng-model 的 getterSetter 选项:

var person = {
    firstName: 'Jimmy',
    lastName: 'Smith',
    get fullName() {
        return this.firstName + ' ' + this.lastName;
    },
    set fullName (name) {
        var words = name.toString().split(' ');
        this.firstName = words[0] || '';
        this.lastName = words[1] || '';
    }
}

person.fullName = 'Jack Franklin';
console.log(person.firstName); // Jack
console.log(person.lastName) // Franklin
Run Code Online (Sandbox Code Playgroud)

这个例子来自http://javascriptplayground.com/blog/2013/12/es5-getters-setters/