【问题标题】:Dependent/Cascading Dropdowns in AureliaAurelia 中的依赖/级联下拉菜单
【发布时间】:2016-09-30 18:59:38
【问题描述】:

我想在 Aurelia 中创建依赖下拉菜单。

我所说的依赖下拉菜单的意思是,如果您单击第一个下拉菜单中的一个项目,那么第二个下拉菜单中的选项会根据您单击的内容进行过滤。如果您查看我的 js-fiddle,您会注意到,如果您在第一个下拉列表中选择 Toyota,第二个下拉列表中会填充 Toyota 车型(卡罗拉、凯美瑞等)。如果您在第一个下拉列表中选择本田,则第二个将使用本田车型(雅阁、思域等)填充自己。你明白了。

在 Angular 中执行此操作非常简单,只需要很少的代码,我想知道在 Aurelia 中执行此操作是否也简单明了。我无法在 Aurelia 中找到有关如何执行此操作的资源。下面的小提琴准确地展示了我想要完成的事情(当然,除了我想在 Aurelia 中完成,而不是 Angular)。任何帮助将非常感激。谢谢!

https://jsfiddle.net/nhunt3/wjvvjwzx/

HTML:

<div ng-app="myApp" ng-controller="myController">
My Cars
<br />
<table>
  <thead>
    <tr>
      <td>Make</td>
      <td>Model</td>
    </tr>
  </thead>

  <tbody>
    <tr ng-repeat="car in myCars track by car.uid">
      <td>
        <select ng-model="car.MakeUID" ng-options="make.uid as make.name for make in makes" />
      </td>

      <td>
        <select
        ng-model="car.ModelUID"
        ng-options="model.uid as model.name for model in models | filter: { parentID: car.MakeUID } : true" />
      </td>
    </tr>
  </tbody>
</table>   
</div>

JavaScript:

// the main (app) module
var myApp = angular.module("myApp", []);

angular.module('myApp', []).controller('myController', function($scope) {
    $scope.makes = [
        {name:'Toyota', uid:1},
        {name:'Honda', uid:2},
        {name:'Ford', uid:3}
    ];

  $scope.models = [
            {name:'Yaris', uid:1, parentID:1},
        {name:'Corolla', uid:2, parentID:1},
        {name:'Camry', uid:3, parentID:1},
        {name:'Highlander', uid:4, parentID:1},
        {name:'Accord', uid:5, parentID:2},
        {name:'Civic', uid:6, parentID:2},
        {name:'Pilot', uid:7, parentID:2},
        {name:'Focus', uid:8, parentID:3},
        {name:'Fiesta', uid:9, parentID:3},
        {name:'Fusion', uid:10, parentID:3},
        {name:'F-150', uid:10, parentID:3}
    ];

  $scope.myCars = [
        {uid:1, MakeUID:1, ModelUID:2},
        {uid:2, MakeUID:1, ModelUID:3},
        {uid:3, MakeUID:3, ModelUID:8}
    ];
});

【问题讨论】:

    标签: aurelia dropdown


    【解决方案1】:

    对于找到此帖子的其他用户:

    app.html

    <template>
      <require from="./filter"></require>
      <table>
      <thead>
        <tr>
          <td>Make</td>
          <td>Model</td>
        </tr>
      </thead>
      <tbody>
        <tr repeat.for="car of myCars">
          <td>
            <select value.bind="car.MakeUID" change.delegate="resetModel(car)">
              <option value="0">select one of ...</option>
              <option repeat.for="make of makes" model.bind="make.uid">${make.name}</option>
            </select>
          </td>
          <td>
            <select value.bind="car.ModelUID">
              <option value="0">select one of ...</option>
              <option repeat.for="model of models | filter:'parentID':car.MakeUID" model.bind="model.uid">${model.name}</option>
            </select>
          </td>
        </tr> 
      </tbody>
    </template>
    

    app.js

    export class App { 
        makes = [
            {name:'Toyota', uid:1},
            {name:'Honda', uid:2},
            {name:'Ford', uid:3}
        ];
    
        models = [
            {name:'Yaris', uid:1, parentID:1},
            {name:'Corolla', uid:2, parentID:1},
            {name:'Camry', uid:3, parentID:1},
            {name:'Highlander', uid:4, parentID:1},
            {name:'Accord', uid:5, parentID:2},
            {name:'Civic', uid:6, parentID:2},
            {name:'Pilot', uid:7, parentID:2},
            {name:'Focus', uid:8, parentID:3},
            {name:'Fiesta', uid:9, parentID:3},
            {name:'Fusion', uid:10, parentID:3},
            {name:'F-150', uid:10, parentID:3}
        ];
    
        myCars = [
            {uid:1, MakeUID:1, ModelUID:2},
            {uid:2, MakeUID:1, ModelUID:3},
            {uid:3, MakeUID:3, ModelUID:8}
        ];
    
        resetModel(car) {
          car.ModelUID = 0;
        }
    }
    

    filter.js

    export class FilterValueConverter {
      toView(array, propertyName, filter_on) {
        return array.filter(i => i[propertyName] == filter_on);
      }
    }
    

    旧答案

    我认为这与您在 Aurelia 中的 Angular 代码相同:

    <template>
      <require from="./filter"></require>
      <table>
      <thead>
        <tr>
          <td>Make</td>
          <td>Model</td>
        </tr>
      </thead>
      <tbody>
        <tr repeat.for="car of myCars">
          <td>
            <select value.bind="car.MakeUID" ref="selected_car">
              <option repeat.for="make of makes" value.bind="make.uid">${make.name}</option>
            </select>
          </td>
    
          <td>
            <select value.bind="car.ModelUID">
              <option repeat.for="model of models | filter:'parentID':selected_car.value">${model.name}</option>
            </select>
          </td>
        </tr> 
      </tbody>
    </template>
    

    你还需要这个过滤器:

    export class FilterValueConverter {
      toView(array, propertyName, filter_on) {
        return array.filter(i => i[propertyName] == filter_on);
      }
    }
    

    https://gist.run/?id=91b23375e0b73afe7f21825f67cfeabf

    【讨论】:

    • 谢谢,埃里克!这很棒!我的有几个小功能,而你的则没有,但我相信我能弄明白。 (1) 当你选择一个make in mine时,模型选择的是blank而不是第一个模型。 (2) 当我的页面加载时,它显示myCars,即丰田卡罗拉、丰田凯美瑞和福特福克斯。你的只是显示了丰田雅力士一路下来。但就像我说的那样,那是次要的,你几乎得到了所有。万分感谢!我给它几天看看是否有更好的答案然后我会接受你的。
    • 我试图为你的答案投票,但它说我不能投票,直到我的声誉更高。
    • 我想得越多,我就越意识到 myCars 数组没有被选中实际上是非常重要的。 MyCars 将来自数据库。并且来自数据库的值需要在页面加载时显示在屏幕上。这很关键,我认为我不能接受没有答案的答案。我想我可能是其中的一部分。如果你用下面的内容替换你的 gist 的 app.html 中的第一个 td(我在选项标签中添加了 model.bind="make.uid" ),那么页面加载时会显示出来......我只是可以不让模型出现。
    • 抱歉,我一开始以为你想知道如何引用元素
    【解决方案2】:

    我为你完成了你的解决方案,但你给了我一个非常关键的开始。我在您的 make td 中删除了一个不必要的 ref 并添加了几个 model.binds 并更改了您的过滤器匹配的内容。

    查看我从你的分支中提取的最终要点。

    https://gist.run/?id=e0b9c401370a954b594ad2415d983099

    【讨论】:

    • 几分钟前刚做了同样的事情 :-),在上次编辑和这个 :-) 之间的时间里正在回家 :-) 还有一个小问题。尝试选择丰田汉兰达然后福特,然后它应该会重置。
    • 我不确定这是否只能从 html 中修复,但如果 db 中的汽车可以通过 get 和 setter 转换为 js 类,则可以修复。只要你设置汽车,重置模型。
    • 查看此要点的最新版本:gist.run/?id=91b23375e0b73afe7f21825f67cfeabf 修复了上述问题,但您仍需要为此向 js 添加代码。
    • 这是我的要点的一个有趣的行为......而且只是有时会发生......奇怪......我明天会调查一下,看看我是否找不到更好的解决方案。不过,您的重置功能现在绝对是一个很好的解决方案。再次感谢您的帮助。
    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2016-08-13
    • 2011-03-03
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多