【问题标题】:Angularjs: Separate elements for 'editable' mode and 'readonly' mode?Angularjs:“可编辑”模式和“只读”模式的单独元素?
【发布时间】:2016-07-23 05:06:13
【问题描述】:

我有一个包含很多表单元素的 Angular 应用程序。在“编辑”模式下,用户可以编辑输入项、更改选项、标记复选框等。在“读取”模式下,应该只能读取这些值。只有管​​理员可以编辑页面上的任何内容,其他人只能阅读内容。

我想做的只是让脚本在只读模式下使用纯 spandiv 元素,以减少整体观察者的数量。在实现方面,我总是不得不定义两个单独的 html '块',如下所示。

exampleInput.tpl.html

注意:我在这里使用ng-if,因为我想以只读模式从DOM中删除输入元素,以减少观察者的数量。

    <!-- editable mode. -->
    <input 
      ng-if="!$ctrl.isReadOnly()"
      ng-model="$ctrl.value" 
      value="$ctrl.value"
    />
    <!-- read only -->
    <span 
      ng-if="$ctrl.isReadOnly()"
      ng-bind="$ctrl.value">
    </span>

exampleInput.comp.js

    // The example-input component
    (function(){
      "use strict";
      angular
        .module("exampleInput", ["ngSanitize", "userSettings"])
        .component("exampleInput", {
          templateUrl: "exampleInput.tpl.html",
          bindings: {
            value: "="
          },
          transclude: true,
          controller: ["$scope", "userSettings", function($scope, userSettings){
              var ctrl = this;
              ctrl.isReadOnly = userSettings.isReadOnly;
            }
          ]
        });
    }());

应用程序

    <qa-input value="value.foobar">
    </qa-input>

我的问题

有没有更好的方法呢?我知道我可以只有一个输入元素并使用 css 来控制“禁用”模式下的样式,但这不会删除观察者,这是我这样做的主要原因。我对 Angular 还很陌生,所以任何建议都值得赞赏。

我正在使用 Angular 1.5.x。

【问题讨论】:

  • 你可以使用something like this 吗?它已经拥有enable / disable 和许多其他功能。我将它用于我的一个应用程序,它可以节省大量时间。
  • 哦,哇,我什至不知道这存在!感谢您指出!

标签: angularjs forms


【解决方案1】:

您可以创建一个用于编辑的模板和一个用于读取的模板,然后根据您是否处于编辑模式,通过更改传递给ng-include 的变量来交换它们,而不是每个元素都这样做。

【讨论】:

  • 这听起来是一个非常棒的主意。你知道这样做是否会对性能产生任何影响(假设我所有的模板文件都存储在同一个目录中)?
  • 我不知道。事实上,您应该能够在只读模板中的任何地方使用一次性绑定语法 {{ :: variable }} 以使其真正轻量级。
  • 如果您担心加载模板本身的性能,通常可以忽略不计。但是,您也可以通过注入 $templateCache 来预加载它们。
  • 还可以使用&lt;ng-template&gt; 对依赖相同ngIf 条件的相邻控件集进行分组,以使其更清晰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多