将指令添加到现有元素

时间:2013-04-09 19:34:09

标签: angularjs angularjs-directive

我正在尝试在将来的某个时刻向元素添加必需的指令。 在示例中,如果模型字段是脏的,则使元素成为必需元素。 我试图设置所需的属性(有点乐观) 我现在正在编译并链接元素并尝试用新元素替换旧的elemenet。

我的元素刚刚从页面中消失了? 我是以正确的方式来做这件事吗?

 app.directive('requiredIfDirty', function ($compile, $timeout) {
                        return {
                            restrict: "A",
                            require: // element must have ng-model attribute.
                            'ngModel',
                            link: // scope = the parent scope
                            // elem = the element the directive is on
                            // attr = a dictionary of attributes on the element
                            // ctrl = the controller for ngModel.
                            function (scope, elem, attr, ctrl) {
                                var unsubscribe = scope.$watch(attr.ngModel, function (oldValue, newValue) {
                                    if(angular.isUndefined(oldValue)) {
                                        return;
                                    }
                                    attr.$set("required", true);
                                    $timeout(function () {
                                        var newElement = $compile(elem)(scope);
                                        elem.replaceWith(newElement);
                                    }, 1);
                                    unsubscribe();
                                });
                            }
                        };
                    });

2 个答案:

答案 0 :(得分:0)

您必须在指令中使用Transclusion。这将允许您抽取内容,将required附加到它,然后编译它。这是一个很好的教程,解释了基本概念:Egghead.io - AngularJS - Transclusion Basics

答案 1 :(得分:-2)

你实际上并不需要这样做。 Angular实际上有一个指令ng-required

http://docs.angularjs.org/api/ng.directive:input.text

您可以在任何具有ng-model的字段上提供ng-required表达式,并根据表达式为true来添加所需的验证器。

来自文档

  

ngRequired(可选) - {string=} - 添加必需的属性和   当ngRequired时,元素需要验证约束   expression的计算结果为true。使用ngRequired而不是必需的时候   你想数据绑定到所需的属性。