Так что это немного сложно, и я попытаюсь объяснить его полностью. В конечном итоге вопрос, на который я пытаюсь ответить, - это «Как я могу напечатать модель, а не значение модели, в HTML?» Я верю, что ответ на этот вопрос решит мою проблему, но я собираюсь обсудить мою проблему в полном объеме, чтобы вы все могли сказать мне, что я, вероятно, ошибаюсь. В этом случае у меня много переписывания, поэтому я надеюсь, что нет.Создание уникального идентификатора с повторяющейся структурой директивы в AngularJS
Сценарий: Вот исходная HTML-страница, где «in» - это настраиваемая директива.
<field model="model1" placeholder="Model 1" type="input"></field>
<field model="model2" placeholder="Model 2" type="input"></field>
<field model="model3" placeholder="Model 3" type="input"></field>
Настоящая пользовательская директива.
app.directive("Field", function(){
return{
restrict: "E",
scope: { model: '=', placeholder:'@', type: '@'},
templateUrl: function(tElement, tAttrs){
return 'views/common/' + tAttrs.type + '.html';
}
};
});
Вот шаблон для директивы. Атрибут type просто загружается в разные шаблоны, поэтому мне не нужно создавать сложную структуру if then. Потерпите меня, это может стать немного сложнее.
<field-label model="model">{{placeholder}}</field-label>
<div class="col-sm-2 no-right-pad">
<input type="text" ng-model="model.value" placeholder="{{placeholder}}" class="form-control input-sm"></input>
</div>
<div class="col-sm-2 no-pad">
<field-options field-options-model="model" class="field-options"></field-options>
</div>
Как вы должны быть в состоянии сказать, это форма. Каждый начальный директивный вызов создает группу форм, содержащую метку, ввод и директиву, с помощью которых параметры могут быть добавлены в модель. Ради этого упражнения, скажем, я хочу иметь возможность добавлять комментарии к каждому входу. Я немного загрязнен, когда вы входите в директиву опций полей, и я меняю имя модели, это наследие предыдущих попыток и ничего не болит, но я все равно могу это изменить. Мне это не обязательно нужно, потому что директивы вложены и, таким образом, обмениваются $ scopes. Вот что директива:
app.directive("FieldOptions", function() {
return {
restrict: "E",
scope: { field: '=FieldOptionsModel' },
templateUrl: 'views/common/field-options.html'
};
});
И этот шаблон:
<div class="dropdown">
<a ng-href class="dropdown-toggle btn btn-bars" data-toggle="dropdown" tabindex="-1"><i class="fa fa-bars"></i></a>
<ul class="dropdown-menu pull-right">
<li><a data-toggle="modal" href="#{{field}}-comment-modal">Add Comment</a></li>
</ul>
</div>
<div id="{{field}}-comment-modal" class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h3>Submit Comment</h3>
</div>
<div class="modal-body">
<div class="form-group">
<label class="control-label">Add Comment</label>
<textarea ng-model="field.comments[0].comment" class="form-control"></textarea>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" data-dismiss="modal">Cancel</button>
<button class="btn btn-primary" data-dismiss="modal" href="#">Add Comment</button>
</div>
</div>
</div>
</div>
OK, в случае, если вы не знаете, мои полевые опции есть кнопка с выпадающим списком, который выбирает всплывающее окно. Поскольку мы повторяем директивы, вы можете сразу сказать, что в настоящее время в структуре DOM хранятся по существу 3 идентичные копии этого всплывающего окна. 1 для модели 1, 1 для модели 2 и 1 для модели 3. Теперь у нас есть проблема с возможностью вызова соответствующего всплывающего окна для каждой группы полей. Поскольку он построен с одинаковым идентификатором, обычно есть 3 идентичных идентификатора, и браузеры не могут справиться с этим, поэтому они открывают только первый. Мое решение, как вы можете видеть здесь, - вызвать имя модели и ввести ее в идентификатор для всплывающего окна комментариев, что делает его уникальным для каждой группы полей. Проблема в том, что id = "{{field}} - comment-modal" не распечатывает id = "model1-comment-modal" как я хочу, вместо этого распечатывает id = "{" значение "=" независимо от того, какое значение может быть установлено, или пустое, если мы нажмем, чтобы добавить комментарий, прежде чем заполнить ввод. "} -комментарно-модальный".
Я возвращаюсь к своему первоначальному вопросу, «Как напечатать строку модели, а не данные, которые она представляет?» или, что я делаю неправильно, или как перестать беспокоиться и получить новую работу.
Примечание: Пожалуйста, будьте нееврейским, мой пример заглушен, фактическое использование является более сложным и повторяющимся.
Интересные варианты. Я мог бы добавить свойство имени, но это потребует изменения очень большой модели данных. Это была одна из моих мыслей, но я не уверен, можем ли мы сделать это со временем. Мы сделали идентификацию идентификатора фабрики на что-то еще, но это не идеально, и мы пытаемся обойти это, чтобы сделать это. Не думайте, что date.now() будет работать, потому что все модальные файлы создаются одновременно, и это должно сохраниться. Не уверен, что это сработает. Спасибо за советы. – trudesign
Ага, я должен быть в состоянии сделать что-то вдоль линий scope.unique = attrs.model; внутри этой функции и просто использовать уникальную возможность ее вызова. Хузза, который сработал! Я также папа, чтобы сделать быстрый regex в конце .replace (/\./ g, '-'), потому что моя модель данных содержит много периодов для разделения уровней, а HTML не любит идентификаторы с периодами. Победитель - это вы! – trudesign