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

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

这里是我到目前为止:

HTML

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

JavaScript

var app = angular.module('plunker',[]);

app.controller('MainCtrl',function($scope) {
  $scope.name = "Felipe";
});

app.directive('myDirective',function($compile) {
  return {
    restrict: 'E',scope: {
      ngModel: '='
    },template: '<div class="some"><label for="{{id}}">{{label}}</label>' +
      '<input id="{{id}}" ng-model="value"></div>',replace: true,require: 'ngModel',link: function($scope,elem,attr,ctrl) {
      $scope.label = attr.ngModel;
      $scope.id = attr.ngModel;
      console.debug(attr.ngModel);
      console.debug($scope.$parent.$eval(attr.ngModel));
      var textField = $('input',elem).
        attr('ng-model',attr.ngModel).
        val($scope.$parent.$eval(attr.ngModel));

      $compile(textField)($scope.$parent);
    }
  };
});

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

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

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

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

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

指示

var app = angular.module('plunker',function($scope) {
  $scope.model = { name: 'World' };
  $scope.name = "Felipe";
});

app.directive('myDirective',function($compile) {
  return {
    restrict: 'AE',//attribute or element
    scope: {
      myDirectiveVar: '=',//bindAttr: '='
    },template: '<div class="some">' +
      '<input ng-model="myDirectiveVar"></div>',//require: 'ngModel',ctrl) {
      console.debug($scope);
      //var textField = $('input',elem).attr('ng-model','myDirectiveVar');
      // $compile(textField)($scope.$parent);
    }
  };
});

Html指令

<body ng-controller="MainCtrl">
  This scope value <input ng-model="name">
  <my-directive my-directive-var="name"></my-directive>
</body>

CSS

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

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

这是我看到的:

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

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

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

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

猜你在找的Angularjs相关文章