Ich versuche, eine Direktive zu erstellen, die ein Eingabefeld mit demselben ng-Modell wie das Element erstellt, das die Direktive erstellt.
Folgendes habe ich mir bisher ausgedacht:
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);
}
};
});
Ich bin jedoch nicht sicher, ob dies der richtige Weg ist, um mit diesem Szenario umzugehen, und es gibt einen Fehler, dass mein Steuerelement nicht mit dem Wert des Zielfelds ng-model initialisiert wird.
Hier ist ein Plunker des obigen Codes: http://plnkr.co/edit/IvrDbJ
Wie geht man damit richtig um?
BEARBEITEN : Nach dem Entfernen der ng-model="value"
aus der Vorlage scheint dies gut zu funktionieren. Ich werde diese Frage jedoch offen halten, da ich überprüfen möchte, ob dies der richtige Weg ist.
scope
und einstellenscope: false
? Wie kann man sichng-model
in diesem Fall binden ?