我试图创建一个指令,创建一个输入字段与创建指令的元素相同的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。
一般来说,您的指令应该使用隔离的范围(您已正确执行),并使用’=’类型范围,如果您希望指令中的值始终映射到父范围中的值。