【问题标题】:Change HTML input field to label by defining custom angular directive通过定义自定义角度指令将 HTML 输入字段更改为标签
【发布时间】:2016-03-29 14:10:46
【问题描述】:

我在某些页面(角度模板)上有很多输入、文本区域和选择。 我想重新定义“输入”指令,这样它将从 localStorage 中获取类似ViewMode = true 的值并将所有输入转换为标签。如果我更改了ViewMode,那么页面刷新输入应该会正常运行。

但我不想在任何角度模板上编辑任何输入标签。

意味着我想覆盖输入、文本区域并选择作为我自己的角度指令。

我无法开始。我应该从哪里开始? (我有使用新名称的自定义指令的经验,但没有任何令人兴奋的 HTML 标签名称)

注意:我不想使用只读(具有正确样式),因为它需要编辑所有输入标签。不仅我有具有隔离范围的自定义指令,因此我需要将 ViewMode 值传递给所有自定义指令。如果用户按下 CTRL+A 内容只读字段未被选中,则更是如此。

我正在寻找如下解决方案

ViewButtonClickEvent () {
   set localStorage.viewMode = true;
   callExistingEditMethod();
}

EditButtonClickEvent () {
  set localStorage.viewMode = false;
  callExistingEditMethod();
}

editPagesModule.directive('input', {
    if(localStorage.viewMode != true)
     //Keep all existing functionality with ng-model
    }
    else {
      //replace input with span or label.
    }
})

【问题讨论】:

  • 也许是你要找的装饰器。
  • Angular 指令不仅可以是一个元素,还可以是一个属性或类,对吧?只需将指令作为可以添加到
  • ng-readonly 在那里,但我不喜欢使用它,因为我必须更新所有输入标签。我想要一些集中的方法。这样我就不需要碰任何东西了。
  • 看起来您需要“就地编辑”功能。网上有很多例子example(不是我的)。
  • 不错的一个。但它不应该是孤立的范围。它应该与现有的 ng-model 和其他 ng 指令一起使用

标签: angularjs angularjs-directive


【解决方案1】:

您可以创建名为 inputselecttextarea 的指令,无需更改现有标记即可自动编译。

工作示例:JSFiddle & Plunker

看起来像这样:

angular.module('myApp', [])
  .directive('input', inputDirective)
  .directive('select', inputDirective)
  .directive('textarea', inputDirective)
  .factory('$editMode', editModeFactory)
;

inputDirective.$inject = ['$editMode'];
function inputDirective($editMode) {
  return {
    link: postLink
  };

  function postLink(scope, iElement, iAttr) {
    scope.$watch($editMode.get, function(edit) {
      if (iElement[0].nodeName === 'SELECT') {
        if (edit === 'true') iElement.removeAttr('disabled');
        else iElement.attr('disabled', true);
      }
      else {
        if (edit === 'true') iElement.removeAttr('readonly');
        else iElement.attr('readonly', true);
      }
    });
  }
}

editModeFactory.$inject = ['$window'];
function editModeFactory($window) {
  return {
    get: function() {
      return $window.localStorage.getItem('editMode');
    },
    set: function(value) {
      $window.localStorage.setItem('editMode', value);
    }
  };
}

我确实使用了readonly 属性(disabled 用于选择),因为我能想到的唯一其他选择是将整个输入元素替换为 div 之类的东西。您还必须缓存原始元素,以便稍后恢复它......并且这样做会破坏您的绑定,因此您必须每次都重新编译每个输入。这似乎是一个可怕的想法。

【讨论】:

  • 非常好的方法。但我无法从我的工作场所打开 jsfiddle。那么你能在 plunker 上克隆它吗?还有一件事我的一些用户没有编辑权限,所以我不需要重新编译来编辑视图。更多概览模式和编辑模式是完全不同的流程,因此我们不需要随时反之。
  • 我在我的答案中添加了一个 plunker。如果您希望将输入更改为 div,您可能可以执行iElement.replaceWith('<div>' + iElement.val() + '</div>'); 之类的操作,但您将丢失输入上的任何绑定、类和其他属性值(除非您明确地将它们添加到您的 html 字符串中)。
  • 哇!这太棒了。我会试试这个,让你知道会发生什么。你的 plunker 在这里是空白 URL。
  • 抱歉,我修复了 plnkr.co 的链接:plnkr.co/edit/6a5X9aRA6IXRsd9ZUteP?p=preview
猜你喜欢
  • 2020-06-20
  • 2015-03-04
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多