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)。 一般来说,您的指令应该使用隔离的范围(您已正确执行),并使用’=’类型范围,如果您希望指令中的值始终映射到父范围中的值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |