【问题标题】:Create an Angularjs Filter with two file json使用两个文件 json 创建一个 Angularjs 过滤器
【发布时间】:2014-12-18 09:01:48
【问题描述】:

我是 angular 新手,但过滤器有问题。 我有两个不同的文件 json 像这样:

    [
        {
            "IdPers": "1067",
            "CognNome": "JANE SMITH",
            "Sex": "F"

        },
        {
            "IdPers": "1093",
            "CognNome": "JOHN SMITH",
            "Sex": "M"

        }

        ]

和: [

        {
            "IdPers": "1067",
            "DescRuol": "Membro"
        },
        {
            "IdPers": "163",
            "DescRuol": "Membro"
        }
        ]

我放了一个工作 Plunker:http://plnkr.co/edit/1xkyxRallRGtj83fSteg?p=preview

我必须使用文件“OutCommissioni.json”中的字段“DescRuol”创建一个过滤器,这两个文件具有相同的字段“id”。我以为我可以像加入一样做,但我做不出有用的东西!感谢您的帮助

【问题讨论】:

  • 这是一个可能的选择吗?你能把这两个文件改成一个吗?

标签: javascript json angularjs html


【解决方案1】:

对于未来的读者,请忽略我的其他答案 - 我误解了这个问题,并在那里与 cmets 中的 OP 一起制定了详细信息。

要让一个带有多个选项的选择框使用相同的值,首先不要使用 id 作为选择框将使用的直接值 - 而是直接引用对象:

<select data-ng-options="item as item.DescRuol for item in OutCommissioni" id="DescRuol" data-ng-model="filter.IdPers" class="form-control input-sm"></select>

"item as item.DescRuol" 将使用对象本身作为模型值,而不仅仅是 id 值。

接下来,不要直接在过滤器中使用“filter”对象,而是提供一个新对象,其中包含您需要的过滤器对象的值:

<tr data-ng-repeat="Person in OutAnagrafica|filter:{Sex:filter.Sex,IdPers:filter.IdPers.IdPers}">

这里的工作示例:http://plnkr.co/edit/gMvuNny99b8aV66C8GAw?p=preview

【讨论】:

    【解决方案2】:

    编辑:忽略这个答案 - 我误解了这个问题。在我弄清楚 OP 在这个答案的 cmets 中真正想要什么之后,提交了带有最终细节的新答案。

    从每个文件中获取数据后,通过将相关的不同字段分配给一个公共属性来规范化属性的差异,并将两组数据附加到一个数组中。

    var App = angular.module('App', []);
    App.controller("OutAnCtrl", function ($http, $scope) {
    
        $scope.data = [];
    
        $http.get('OutAnagrafica.json')
            .success(function (data) {
                data.forEach(function(item) {
                  item.name = item.CognNome;
                });
                $scope.data.push.apply($scope.data, data);
            });
    
         $http.get('OutCommissioni.json')
            .success(function (data) {
              data.forEach(function(item) {
                item.name = item.DescRuol;
              });
              $scope.data.push.apply($scope.data, data);
            });
    
        $scope.clearBox = function () {
            $scope.filter = "";
        };
    
    });
    

    然后最后更改您的转发器以使用合并的数据对象“数据”和公共属性名称。

    <tr data-ng-repeat="Person in data|filter:filter">
      <td>{{Person.IdPers}}</td>
      <td>{{Person.name}}</td>
      <td>{{Person.Sex}}</td>
    </tr>
    

    更新示例:http://plnkr.co/edit/03rwNY7eLX9i9VCTHz7Z?p=preview

    编辑:我可能误解了,您可能不需要合并这些属性。关键部分只是使用 Array.push.apply 将两个数组附加到单个数组

    // Create initial array
    $scope.data = [];
    
    // Append some arrays
    $scope.data.push.apply($scope.data, [1,2,3]);
    $scope.data.push.apply($scope.data, [4,5,6]);
    
    // $scope.data will now contain [1,2,3,4,5,6]
    

    编辑:我想这就是你要找的东西? http://plnkr.co/edit/jvyXlpv2iBh2n4pZ1miv?p=preview

    <label for="DescRuol">DescRuol:</label>
    <select data-ng-options="item.IdPers as item.DescRuol for item in OutCommissioni" id="DescRuol" data-ng-model="filter.IdPers" class="form-control input-sm"></select>
    

    【讨论】:

    • 感谢您的回复,您太棒了!也许我不能很好地解释,但我想要的是一个带有“DescRuol”字段的过滤器,如果我选择“membro”,过滤器将生成 Jane Smith,因为它们具有相同的 ID。我不知道如果你明白,对不起我的英语!
    • 编辑:我使用 ui-utils 中的“唯一”过滤器来删除选项中的重复项,但是当我有 [ { "IdPers": "163", "DescRuol": "Presidente" }, { "IdPers": "163", "DescRuol": "Membro" } ] 过滤器效果不佳,因为只会过滤一个 DescRuol。唯一的问题??有什么方法可以让过滤器正常工作?
    • 嗯,好的。我想我现在明白你的问题了。听起来您正在尝试使用非唯一值填充下拉选择框?如果是这样,这样做根本没有意义。
    • 是的,但是例如对于字段“sex”来说效果很好。
    • 那是因为您试图为该字段提供两个截然不同的选项。对于可能多次出现相同值的选项列表,选择框不是正确的用户界面选择。除非您想将两个选项连接成下拉列表中的单个选项,都使用单个值或其他东西?例如在上面的示例中,选择中只有一个选项说“Presidente OR Membro”,两者都使用 idPers 163?
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2015-09-28
    • 2020-09-30
    • 2018-12-17
    相关资源
    最近更新 更多