【问题标题】:Angularjs select elements from list and display in textareaAngularjs从列表中选择元素并显示在textarea中
【发布时间】:2015-06-06 19:37:05
【问题描述】:

我对 Angular 和 nya-select 有疑问。

我的角度控制器中的示例数组:

vm.arrayCollection = [
  { name: 'Alice',      mail: 'Class A' },
  { name: 'Bob', mail: 'Class B1' },
  { name: 'Carl', mail: 'Class A2' },
  { name: 'Daniel', mail: 'Class B2' },
  { name: 'Emi', mail: 'Class A3' },
  { name: 'Flank', mail: 'Class B3' },
  { name: 'George', mail: 'Class C4' },
  { name: 'Harry', mail: 'Class C5' }
];

我有选择选项元素:

<ol class = "nya-bs-select" ng-model = "myModel">
  <li nya-bs-option="person in myController.arrayCollection">
    <a>
      {{ person.name }}
    </a>
  </li>
</ol>

第二个是“textarea”:

  <textarea ng-model="myModel2">
    ... ?
  </textarea >

我想实现这个:

当我通过从第一个选择选项中选择另一个人名来更改“myModel”时 -> 我想在文本区域中设置适当的“邮件”。

例如。当我选择“Alice”时 -> 我想在 textarea 中显示“A 类”。此外,当我多选“Alice”、“Bob”时 -> 我想显示“A 类,B1 类”

你能这么好心并帮助我如何实现这一目标? (多选是由“nya-select”插件完成的->所以没关系。我不知道如何根据名称显示arrayCollection中的“mail”值......

【问题讨论】:

    标签: arrays angularjs textarea


    【解决方案1】:

    我不熟悉您使用的插件,但是,我尝试使用 select 元素的多个属性来实现您想要的功能。

    <select multiple="multiple" ng-model="selectedValues">
          <option ng-repeat="mail in a" value="{{mail.name}}">{{mail.mail}}</option>
    
        </select>
        <textarea>{{selectedValues}}</textarea>
    

    请在“http://plnkr.co/edit/u2sXnMkYSEYshAcLgyn7?p=preview”查看插件

    【讨论】:

    • 感谢您的回复。当我们有“通常”的选择时,它工作得很好,但是在我来自 nya-bootstrap-select 的“选择”中,它不使用
    • 感谢您的更新。很抱歉不熟悉 nya-bootstrap-select,将无法提供帮助。
    • :( 很遗憾你不能帮助我...但是感谢你的大力响应。
    • 快乐是我的全部。谢谢你:)
    • 也许上面的解决方案,与 ... 应该以某种方式工作...但我知道如何实现这一点,因为它只显示这个文本: 而不是工作......也许你可以告诉我我应该怎么做?
    【解决方案2】:

    根据下面的 cmets 更新答案。 OP 要求在页面上重用一个通用元素。可能还有其他/更简单的方法可以做到这一点,但我正在扩展之前的答案。

    将每个列表元素中的value 属性设置为person(这对于常规的多选列表是必需的,但对于 nya-select 可能不需要):

    <li nya-bs-option="person in myController.arrayCollection" value="{{person}}">
    

    有序列表中的 ng-model myModel 应该包含选择。我们将使用它来呈现文本区域中的内容。将以下指令添加到应用程序:

    myApp.directive('txtArea', function() {
        return {
            restrict: 'E',
            replace: 'true',
            scope: {data: '=', property: '@'},
            template: "<textarea readonly>{{result()}}</textarea>",
            link: function(scope, elem, attrs) {
                scope.result = function() {
                    var ret = "";
                    angular.forEach(scope.data, function(value, key) {
                        var suff = (key === scope.data.length - 1) ? '' : ', ';
                        ret += JSON.parse(value)[scope.property] + suff;
                    });
                    return ret;
                }
            }
        };
    });
    

    该指令是通用的,可以跨控制器重用。这也在每个中间值之后添加一个逗号。现在将textarea 元素替换为:

    <txt-area data="myModel" property="mail"></txt-area>
    

    myModel 是绑定到有序列表的模型,mail 是要在指令/过滤器中使用的属性。

    使用常规多选列表工作 jsfiddle

    最新更新 jsfiddle 基于以下讨论。

    【讨论】:

    • 感谢您的快速响应,但不幸的是您的解决方案不起作用,因为此文本 显示为“静态文本”,它不能作为角度 ng-repeat 工作。
    • 你能帮我解决这个问题吗?
    • 是的,你是对的。有点晚了,所以我为此道歉:-) 检查我更新的答案。除非您将一些 jsfiddle 放在一起,但我们无法对其进行测试。它适用于普通选择。
    • 非常感谢您的帮助!它工作得很好,但是......我有一些问题和疑虑......这个指令工作正常,但它与这个角度模型严格相关......如果我在网站上有 10 个或更多文本区域怎么办?那么我必须有 10 个或更多指令 -> 我认为这是错误的......此外,我想在这个 textarea 中添加占位符 -> 但它不起作用......如果你有空闲时间,请告诉我应该怎么做我实现了我的目标...
    • 此外 -> 当我将 value="{{person.mail}}" 添加到 -> 元素没有出现在列表中... -> 我必须删除这个并将“value.mail”添加到这个指令中...... -> 然后工作,但它与我的模型严格耦合......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2016-03-29
    • 2013-09-21
    • 2020-03-02
    相关资源
    最近更新 更多