Transclude Function Needs To Modify Clone Properly
Solution 1:
So here's a plunkr with I thinnnnk gets at what you're trying to do: https://plnkr.co/edit/8VxNPVmeLNLKyaQNReM3?p=preview
Note these lines in particular:
HTML:
<toolbar name="myForm" form-one="myForm1" form-two="myForm2">
<form name="myForm" submit="appController.submit()">
Search:<br />
<input type="text" ng-model="appController.searchText" />
</form>
</toolbar>
note that both name
attributes point at the same string "myForm"
. form-one
and form-two
are normal two way bindings that can be bound to your scope properties of choosing, in my example, myForm1
and myForm2
.
JS:
the two way binding definitions
scope: {
formOne: '=',
formTwo: '='
},
and binding the two new forms to respective scope attributes:
link: function (scope, element, attrs, controller, transclude) {
var parent = scope;
transclude(function(clone, scope) {
element.find('[transclude-main]').replaceWith(clone);
var unwatch = scope.$watch(attrs.name, function(form) {
if (form) {
parent.formOne = form;
unwatch();
}
});
});
transclude(function(clone, scope) {
element.find('[transclude-overflow]').replaceWith(clone);
var unwatch = scope.$watch(attrs.name, function(form) {
if (form) {
parent.formTwo = form;
unwatch();
}
});
});
Looking back at your code, this console console.log("myForm", $scope.myForm2)
printed undefined
because angular form
directives are not dynamic. As a result, manually finding the html element and changing the name from myForm
to myForm2
will not change the name of the form bound to scope unless the html has yet to be compiled. But the clone
passed to transclude
has been freshly compiled.
Post a Comment for "Transclude Function Needs To Modify Clone Properly"