【问题标题】:Select multiple display names instead of IDs using AngularJS使用 AngularJS 选择多个显示名称而不是 ID
【发布时间】:2017-02-19 05:52:30
【问题描述】:

我有一个这样的多选:

<select ng-model="listProds" multiple>
  <option value="10">product 1</option>
  <option value="25">product 2</option>
  <option value="35">product 3</option>
  <option value="48">product 4</option>
</select>

这些值是这些产品的 ID(这个选择框是使用 PHP 生成的)

& 我的app.js 文件中有这个简单的代码:

var app = angular.module('myapp', []);
app.controller("PurchasesController", function($scope) {

    // Init products Array
    $scope.listProds = [];

});

当我像这样 {{ listProds }} 显示 listProds 时,我得到一个包含当前选定项目的数组,但如果我选择所有 ["10","25","35","48"],它只会显示这样的 Id。

<fieldset ng-show="listProds.length > 0">
    <div data-ng-repeat="p in listProds track by $index">
        {{ p }} <!– Or –> {{ listProds[$index] }}
        <input type="text" name="pr{{ listProds[$index] }}" />
        <input type="text" name="qt{{ listProds[$index] }}" />
    </div>
</fieldset>

此代码生成两个文本框,用于输入从选择框中选择的每个产品的价格和数量。因此,我不想使用{{ p }}{{ listProds[$index] }} 并显示产品ID,而是想在那里显示产品名称。

提前谢谢你。

【问题讨论】:

    标签: javascript angularjs cakephp angularjs-scope angularjs-ng-repeat


    【解决方案1】:

    您可以创建两个列表:一个用于所有产品,一个用于选定产品的单独列表:

    $scope.listProds = [
      { key: 10, value: 'Product 1' },
      { key: 25, value: 'Product 2' },
      { key: 35, value: 'Product 3' },
      { key: 45, value: 'Product 4' }
    ];
    
    $scope.selectedProds = [];
    

    现在在您的标记中,您可以使用ng-options 来生成您的选项,而不是手动写出您选择中的每个选项。使用这种方法,您基本上是在说每个选项都是一个对象,并且您想使用对象value 作为显示名称。

     <select ng-model="selectedProds" ng-options="prod.value for prod in listProds" multiple>
    

    现在您的$scope.selectedProds 数组将包含产品对象,而不仅仅是键。所以现在您可以轻松地显示名称了:

    <fieldset ng-show="selectedProds.length > 0">
      <div data-ng-repeat="p in selectedProds track by $index">
        {{ p.value }}
        <input type="text" name="pr{{ selectedProds[$index] }}" />
        <input type="text" name="qt{{ selectedProds[$index] }}" />
      </div>
    </fieldset>
    

    不确定您希望输入的名称属性是什么,但我希望您能理解。

    【讨论】:

    • 我不能使用这个选项,因为我不知道如何在你的例子中填充 listProds,因为我的选择框是使用 cakePHP 框架自动填充的,我刚刚添加了 ng -模型。
    • 您可以访问 PHP 吗?您能否请求获取产品列表,而不是让 PHP 为您生成 HTML?否则,您将不得不选择 DOM 元素才能获得显示名称,这不是 Angular 的处理方式。
    • 我认为还有另一种方法。是的,我确实可以使用 PHP,我想我只会 $http.get() 产品列表
    【解决方案2】:

    试试这个。

    var app = angular.module('selTest', []);
    
    app.controller('MainCtrl', function($scope) {
      $scope.selectedProducts = [];
      $scope.products = [
        { id:1, name: 'POne' }, 
        { id:2, name: 'PTwo' }, 
        { id:3, name: 'PThree' }
      ];
      $scope.getNames = function(prods) {
          return prods.map(function(p) {
            return p.name;
          });
      };
      $scope.getIds = function(prods) {
          return prods.map(function(p) {
            return p.id;
          });
      };
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <div ng-app="selTest">
      <div ng-controller="MainCtrl">
        <select name="products" 
          class="form-control input-sm" 
          ng-model="selectedProducts" 
          ng-options="p.name for p in products track by p.id" 
          ng-style="{'width':'100%'}" multiple>
        </select>
    
        <div>Selected Names: {{ getNames(selectedProducts) }}</div>
        <div>Selected Ids: {{ getIds(selectedProducts) }}</div>
      </div>
    </div>

    【讨论】:

    • 谢谢,但重点是不要使用$scope.products 数组,因为我没有那个。 Select multiple 是使用 cakePHP 生成的,我不知道如何在这样的数组中获取它的内容。
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多