AngularJS – 创建一个使用ng-model的指令

前端之家收集整理的这篇文章主要介绍了AngularJS – 创建一个使用ng-model的指令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图创建一个指令,创建一个输入字段与创建指令的元素相同的ng-model。

这里是我到目前为止:

HTML

  1. <!doctype html>
  2. <html ng-app="plunker" >
  3. <head>
  4. <Meta charset="utf-8">
  5. <title>AngularJS Plunker</title>
  6. <link rel="stylesheet" href="style.css">
  7. <script>document.write("<base href=\"" + document.location + "\" />");</script>
  8. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
  9. <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
  10. <script src="app.js"></script>
  11. </head>
  12. <body ng-controller="MainCtrl">
  13. This scope value <input ng-model="name">
  14. <my-directive ng-model="name"></my-directive>
  15. </body>
  16. </html>

JavaScript

  1. var app = angular.module('plunker',[]);
  2.  
  3. app.controller('MainCtrl',function($scope) {
  4. $scope.name = "Felipe";
  5. });
  6.  
  7. app.directive('myDirective',function($compile) {
  8. return {
  9. restrict: 'E',scope: {
  10. ngModel: '='
  11. },template: '<div class="some"><label for="{{id}}">{{label}}</label>' +
  12. '<input id="{{id}}" ng-model="value"></div>',replace: true,require: 'ngModel',link: function($scope,elem,attr,ctrl) {
  13. $scope.label = attr.ngModel;
  14. $scope.id = attr.ngModel;
  15. console.debug(attr.ngModel);
  16. console.debug($scope.$parent.$eval(attr.ngModel));
  17. var textField = $('input',elem).
  18. attr('ng-model',attr.ngModel).
  19. val($scope.$parent.$eval(attr.ngModel));
  20.  
  21. $compile(textField)($scope.$parent);
  22. }
  23. };
  24. });

但是,我不确定这是处理这种情况的正确方法,并且有一个错误,我的控制没有得到初始化ng-model目标字段的值。

这里有一个Plunker上面的代码http://plnkr.co/edit/IvrDbJ

处理这个问题的正确方法是什么?

编辑:从模板中删除ng-model =“value”后,这似乎工作正常。但是,我会保持这个问题,因为我想双重检查这是正确的方法这样做。

这实际上是很好的逻辑,但你可以简化的东西有点。

指示

  1. var app = angular.module('plunker',function($scope) {
  2. $scope.model = { name: 'World' };
  3. $scope.name = "Felipe";
  4. });
  5.  
  6. app.directive('myDirective',function($compile) {
  7. return {
  8. restrict: 'AE',//attribute or element
  9. scope: {
  10. myDirectiveVar: '=',//bindAttr: '='
  11. },template: '<div class="some">' +
  12. '<input ng-model="myDirectiveVar"></div>',//require: 'ngModel',ctrl) {
  13. console.debug($scope);
  14. //var textField = $('input',elem).attr('ng-model','myDirectiveVar');
  15. // $compile(textField)($scope.$parent);
  16. }
  17. };
  18. });

Html指令

  1. <body ng-controller="MainCtrl">
  2. This scope value <input ng-model="name">
  3. <my-directive my-directive-var="name"></my-directive>
  4. </body>

CSS

  1. .some {
  2. border: 1px solid #cacaca;
  3. padding: 10px;
  4. }

你可以看到它在行动与这Plunker

这是我看到的:

>我明白你为什么要使用“ng-model”,但在你的情况下它不是必要的。 ng-model是将现有的html元素与范围中的值链接。因为你自己创建一个指令,你创建一个“新的”html元素,所以你不需要ng-model。

编辑正如Mark在他的评论中提到的,没有理由不能使用ng-model,只是为了保持约定。

>通过在您的指令(“隔离”范围)中显式创建范围,指令的作用域不能访问父范围上的“name”变量(这就是为什么,我想要使用ng-model)。
>我从你的指令删除ngModel,并替换为一个自定义名称,你可以更改为任何。
>使它仍然工作的东西是’=’签署范围。在“scope”标题下,查看docs docs

一般来说,您的指令应该使用隔离的范围(您已正确执行),并使用’=’类型范围,如果您希望指令中的值始终映射到父范围中的值。

猜你在找的Angularjs相关文章