【发布时间】:2014-03-23 11:42:22
【问题描述】:
我们有一个在许多应用程序中使用的联系表。有许多重复的默认值、验证规则、结构等。我们正在研究一组指令,以使视图更加语义化且不那么冗长。
我们正在瞄准几个目标。
在父指令中定义一次联系表单模型,如下所示:
<div my-form model='formModel'>。关联的子指令将能够从model属性中获取基本模型。为每个输入提供默认配置(大小、验证规则、占位符、类等),但允许在必要时覆盖属性。因此,我们使用
my-form指令的控制器创建子指令进行通信。我们还希望这些子指令绑定到应用程序控制器的模型formModel。
我在实现这一点时遇到了一些麻烦。
formModel通过父指令的控制器公开,但我必须在link函数中使用scope.$parent手动$compile子指令。这对我来说似乎很臭,但是如果我尝试使用子指令的范围,编译的 HTML 包含正确的属性(它在源代码中可见),但它没有绑定到控制器并且它不会出现在任何范围内与 Batarang 一起检查。我猜我添加属性太晚了,但不确定如何更早添加属性。虽然我可以在每个子指令上使用
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));
}
};
});
【问题讨论】:
标签: angularjs angularjs-directive transclusion