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