我们有一个在许多应用程序中使用的联系表。有许多重复的默认值、验证规则、结构等。我们正在研究一组指令,以使视图更加语义化且不那么冗长。
我们正在瞄准几个目标。
在父指令中定义一次联系表单模型,如下所示
<div my-form model='formModel'>
:关联的子指令将能够从model
属性中获取基本模型。为每个输入提供默认配置(大小、验证规则、占位符、类等),但允许在必要时覆盖属性。因此,我们使用
my-form
指令的控制器创建子指令进行通信。我们还希望这些子指令绑定到应用程序控制器的模型formModel
。
我在实现这一点时遇到了一些麻烦。
formModel
通过父指令的控制器公开,但我必须在函数中手动$compile
使用子指令。这对我来说似乎很臭,但如果我尝试使用子指令的范围,编译的 HTML 包含正确的属性(它在源代码中可见),但它没有绑定到控制器,并且它不会出现在任何范围内与 Batarang 一起检查。我猜我添加属性太晚了,但不确定如何更早添加属性。scope.$parent
link
虽然我可以
ng-model
在每个子指令上使用,但这正是我想要避免的。我希望结果视图非常干净,并且必须在每个字段上指定模型名称是重复且容易出错的。我还能如何解决这个问题?
这是一个jsfiddle,它具有我想要完成的工作但“臭”的设置。
angular.module('myApp', []).controller('myCtrl', function ($scope) {
$scope.formModel = {
name: 'foo',
email: 'foo@foobar.net'
};
})
.directive('myForm', function () {
return {
replace: true,
transclude: true,
scope: true,
template: '<div ng-form novalidate><div ng-transclude></div></div>',
controller: function ($scope, $element, $attrs) {
$scope.model = $attrs.myModel;
this.getModel = function () {
return $scope.model;
};
}
};
})
.directive('myFormName', function ($compile) {
return {
require: '^myForm',
replace: true,
link: function (scope, element, attrs, parentCtrl) {
var modelName = [parentCtrl.getModel(),attrs.id].join('.'),
template = '<input ng-model="' + modelName + '">';
element.replaceWith($compile(template)(scope.$parent));
}
};
});