2016-02-10 2 views
0

Мне нужно знать, если это возможно, и в случае да, как это сделать.Wrap divs вокруг ввода с директивой

Я вход в моей форме, как это:

<input type="text" class="form-control" name="dirinput" 
     placeholder="Placeholder" 
     translate 
     translate-attr-placeholder="{{ placeholder }}" 
     ng-model-options="{ debounce: 500 }"> 

Я хотел бы, вокруг этого входа, завернуть дивы управлять этикетки и ошибки, если есть (как показывает строку в случае ошибки) , Мне также нужно иметь возможность указывать директивы на входном элементе.

На данный момент я писать весь этот код для каждого входа

 <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6"> 
      <div class="form-group label-static" 
       ng-class="{ 'has-error': relatedForm.first_name.$invalid && relatedForm.first_name.$dirty, 
       'has-success' : relatedForm.first_name.$valid }"> 
       <label for="input-first_name" 
         class="control-label" translate> 
        FIRST_NAME 
       </label> 
       <input type="text" class="form-control" 
         id="input-first_name" name="first_name" 
         placeholder="First name" 
         ng-model="relatedCtrl.data.first_name" 
         ng-model-options="{ debounce: 500 }" 
         required autofocus> 
       <p class="help-block" 
        ng-if="relatedForm.first_name.$error.required" translate> 
        ERR_FIRST_NAME_REQUIRED 
       </p> 
      </div> 
     </div> 

Если вы можете видеть, что есть много коды «дубликат», и я брожу, если это возможно, чтобы избежать этого.

Большое спасибо

+0

Да, можно, и, вероятно, следует использовать директиву, однако вы не можете «обернуть» директивы вокруг других объектов (насколько я знаю). Вместо этого создайте директиву и передайте параметры для заполнения динамических данных (таких как имена ввода, имена моделей и т. Д.). – Seonixx

+0

Можете ли вы показать мне пример? – Stefano

ответ

0

Вы можете использовать transclude особенность угловых директив:

myModule.directive('myInput', function() { 
    return { 
    transclude: true, 
    templateUrl: 'my-transclude.html' 
    }; 
}); 

В my-transclude.html:

<div class="wrapper> 
    <div ng-transclude></div> 
</div> 

В вашем HTML:

<my-input> 
    <input type="text" class="form-control" name="dirinput" 
     placeholder="Placeholder" 
     translate 
     translate-attr-placeholder="{{ placeholder }}" 
     ng-model-options="{ debounce: 500 }"> 
</my-input> 

Ссылка: Angular directives

Конечно, вы можете использовать template вместо templateUrl непосредственно без дополнительного HTML-файла, но templateUrl «s хорошая практика, чтобы принять.

0

Да, вы можете создать директиву с transclude, которая обернет ваш ввод.

Живой пример на jsfiddle.

var myApp = angular.module("myApp", []); 
 

 

 
myApp.controller("myCtrl", function($scope) { 
 

 
}); 
 

 

 
myApp.directive("wrapExample", function() { 
 
    return { 
 
    restrict: 'E', 
 
    transclude:true, 
 
    scope: { 
 
     proccess: "=", 
 
    }, 
 
    template:'<div><label>I\'m before wrapped label</label><div ng-transclude></div><div>I\'m after wrapped div</div></div>', 
 
    link: function(scope, element, attrs) { 
 
    }, 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<body ng-app="myApp" ng-controller="myCtrl"> 
 
    <wrap-example> 
 
    <input value="input" /> 
 
    </wrap-example> 
 
</body>

+0

Можно ли добавить пользовательские директивы к элементу ввода? как пользовательская проверка данных – Stefano

+0

Извините, я не знаю) –

Смежные вопросы