繁体   English   中英

ng-options在加载(AngularJS)的选择框中未显示ng-model对象

[英]ng-options doesn't show the ng-model object in the select box on load (AngularJS)

我有一个html select输入。 在这里我使用AngularJS:

<select class="form-control" 
    ng-model="t.selected" 
    ng-options="option | matriseValgFilter for option in t.Valgalternativer" 
    ng-change="change(t.selected)">
</select>

问题是定义了t.select,但是它没有显示在html select列表框中。 如果选择某项,则t.select会发生变化,并且显示的值也会正确更改,我希望它在加载时显示t.select。

这是棱角分明的代码,做了个小提琴以说明得更好: https : //jsfiddle.net/fiddlejan/Lt0cuwLd/

angular.module('app', ['ngAnimate'])

.controller('controller', function($scope) {

  $scope.t = {
    "Tabellnavn": "BE3.2:1",
    "Siffer": "x",
    "Stikkord": "Utvendig kledning:",
    "Tekst": {
      "Format": 0,
      "Content": "{Matrise BE3.2:1}"
    },
    "Merknader": null,
    "Delprodukter": null,
    "Valgalternativer": [{
      "Siffer": "-",
      "Tekst": "{Matrise BE3.2:1}",
      "Tekst2": null,
      "Kode": null,
      "Delalternativer": null
    }, {
      "Siffer": "00",
      "Tekst": "Valgfri",
      "Tekst2": null,
      "Kode": null,
      "Delalternativer": null
    }, {
      "Siffer": "11",
      "Tekst": "Murt forblending",
      "Tekst2": null,
      "Kode": "NB2.7---x-",
      "Delalternativer": null
    }, {
      "Siffer": "21",
      "Tekst": "Bordkledning på vegg utvendig – stående bord",
      "Tekst2": null,
      "Kode": "QK2.11xx---",
      "Delalternativer": null
    }, {
      "Siffer": "22",
      "Tekst": "Bordkledning på vegg utvendig – stående ukantede bord",
      "Tekst2": null,
      "Kode": "QK2.12x---",
      "Delalternativer": null
    }, {
      "Siffer": "23",
      "Tekst": "Bordkledning på vegg utvendig – stående spaltekledning",
      "Tekst2": null,
      "Kode": "QK2.15xx---",
      "Delalternativer": null
    }, {
      "Siffer": "24",
      "Tekst": "Bordkledning på vegg utvendig - liggende bord",
      "Tekst2": null,
      "Kode": "QK2.21xx---",
      "Delalternativer": null
    }, {
      "Siffer": "26",
      "Tekst": "Platekledning på vertikal flate utvendig utvendig",
      "Tekst2": null,
      "Kode": "QK5.226--",
      "Delalternativer": null
    }, {
      "Siffer": "31",
      "Tekst": "Kledning med tynnplatekassetter av kopper",
      "Tekst2": null,
      "Kode": "SM4.2--",
      "Delalternativer": null
    }, {
      "Siffer": "32",
      "Tekst": "Kledning med tynnplatekassetter av titansink",
      "Tekst2": null,
      "Kode": "SM4.3--",
      "Delalternativer": null
    }, {
      "Siffer": "33",
      "Tekst": "Kledning med tynnplatekassetter av aluminium",
      "Tekst2": null,
      "Kode": "SM4.4--",
      "Delalternativer": null
    }, {
      "Siffer": "34",
      "Tekst": "Kledning med tynnplatekassetter av varmforsinket stål",
      "Tekst2": null,
      "Kode": "SM4.5--",
      "Delalternativer": null
    }, {
      "Siffer": "35",
      "Tekst": "Kledning med plane metallplater",
      "Tekst2": null,
      "Kode": "SM5.1",
      "Delalternativer": null
    }, {
      "Siffer": "88",
      "Tekst": "Uten utvendig kledning",
      "Tekst2": null,
      "Kode": null,
      "Delalternativer": null
    }, {
      "Siffer": "99",
      "Tekst": "Annen utvendig kledning – må spesifiseres",
      "Tekst2": null,
      "Kode": null,
      "Delalternativer": null
    }],
    "selected": {
      "Siffer": "99",
      "Tekst": "Annen utvendig kledning – må spesifiseres",
      "Tekst2": null,
      "Kode": null,
      "Delalternativer": null
    }
  };

  $scope.change = function(selected) {
    console.log(selected);
  }
})
.filter('matriseValgFilter', function() {

    return function (option) {

        if (!isNaN(option.Siffer) && option.Kode != null){
            return option.Siffer + ' - ' + option.Tekst + ' (' + option.Kode + ')';
        }

        if (!isNaN(option.Siffer)){
            return option.Siffer + ' - ' + option.Tekst;
        }

        return option.Tekst;


    }
});

编辑:为澄清起见,将t.select设置为“ 99-Annen utvendig kledning –måspesifiseres”,这就是应在选择框中显示的负荷。

您需要将变量t.selected初始化$scope.t.selected = $scope.t.Valgalternativer[0];

jsfiddle上的实时示例。

 angular.module('app', ['ngAnimate']) .controller('controller', function($scope) { $scope.t = { "Tabellnavn": "BE3.2:1", "Siffer": "x", "Stikkord": "Utvendig kledning:", "Tekst": { "Format": 0, "Content": "{Matrise BE3.2:1}" }, "Merknader": null, "Delprodukter": null, "Valgalternativer": [{ "Siffer": "-", "Tekst": "{Matrise BE3.2:1}", "Tekst2": null, "Kode": null, "Delalternativer": null }, { "Siffer": "00", "Tekst": "Valgfri", "Tekst2": null, "Kode": null, "Delalternativer": null }, { "Siffer": "11", "Tekst": "Murt forblending", "Tekst2": null, "Kode": "NB2.7---x-", "Delalternativer": null }, { "Siffer": "21", "Tekst": "Bordkledning på vegg utvendig – stående bord", "Tekst2": null, "Kode": "QK2.11xx---", "Delalternativer": null }, { "Siffer": "22", "Tekst": "Bordkledning på vegg utvendig – stående ukantede bord", "Tekst2": null, "Kode": "QK2.12x---", "Delalternativer": null }, { "Siffer": "23", "Tekst": "Bordkledning på vegg utvendig – stående spaltekledning", "Tekst2": null, "Kode": "QK2.15xx---", "Delalternativer": null }, { "Siffer": "24", "Tekst": "Bordkledning på vegg utvendig - liggende bord", "Tekst2": null, "Kode": "QK2.21xx---", "Delalternativer": null }, { "Siffer": "26", "Tekst": "Platekledning på vertikal flate utvendig utvendig", "Tekst2": null, "Kode": "QK5.226--", "Delalternativer": null }, { "Siffer": "31", "Tekst": "Kledning med tynnplatekassetter av kopper", "Tekst2": null, "Kode": "SM4.2--", "Delalternativer": null }, { "Siffer": "32", "Tekst": "Kledning med tynnplatekassetter av titansink", "Tekst2": null, "Kode": "SM4.3--", "Delalternativer": null }, { "Siffer": "33", "Tekst": "Kledning med tynnplatekassetter av aluminium", "Tekst2": null, "Kode": "SM4.4--", "Delalternativer": null }, { "Siffer": "34", "Tekst": "Kledning med tynnplatekassetter av varmforsinket stål", "Tekst2": null, "Kode": "SM4.5--", "Delalternativer": null }, { "Siffer": "35", "Tekst": "Kledning med plane metallplater", "Tekst2": null, "Kode": "SM5.1", "Delalternativer": null }, { "Siffer": "88", "Tekst": "Uten utvendig kledning", "Tekst2": null, "Kode": null, "Delalternativer": null }, { "Siffer": "99", "Tekst": "Annen utvendig kledning – må spesifiseres", "Tekst2": null, "Kode": null, "Delalternativer": null }], "selected": { "Siffer": "99", "Tekst": "Annen utvendig kledning – må spesifiseres", "Tekst2": null, "Kode": null, "Delalternativer": null } }; $scope.t.selected = $scope.t.Valgalternativer[0]; }) .filter('matriseValgFilter', function() { return function (option) { if (!isNaN(option.Siffer) && option.Kode != null){ return option.Siffer + ' - ' + option.Tekst + ' (' + option.Kode + ')'; } if (!isNaN(option.Siffer)){ return option.Siffer + ' - ' + option.Tekst; } return option.Tekst; } }); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.4.0/animate.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular-animate.min.js"></script> <body ng-app="app"> <div ng-controller="controller as c" style="padding:10px;"> <select class="form-control" ng-model="t.selected" ng-options="option | matriseValgFilter for option in t.Valgalternativer" > </select> <pre style="margin-top: 10px;"> {{t.selected | json}} </pre> </div> </body> 

更新

噢,我明白。 您在变量t定义t.selected 但这不起作用,因为

{
  "Siffer": "99",
  "Tekst": "Annen utvendig kledning – må spesifiseres",
  "Tekst2": null,
  "Kode": null,
  "Delalternativer": null
}!= {
  "Siffer": "99",
  "Tekst": "Annen utvendig kledning – må spesifiseres",
  "Tekst2": null,
  "Kode": null,
  "Delalternativer": null
}

另一个词不相等。

$scope.t.Valgalternativer[$scope.t.Valgalternativer.length-1]!=$scope.t.selected

尝试这个

$scope.t.selected = .Valgalternativer[$scope.t.Valgalternativer.length-1];

编辑

根据您的评论,要使其起作用,一种方法是像这样设置所选属性。

$scope.t.selected =$scope.t.Valgalternativer[2];

如果对象来自其他服务或json,则可能必须从t.Valgalternativer中查找/过滤,然后分配适当的索引。

之所以如此,是因为,正如其他答案所指出的那样,如果您以自己的方式初始化选择的对象,那么它将是一个哈希值不同的新对象。

如果您喜欢这种方法,请从t中删除“ selected”属性,然后如上所述单独添加。 无需更改任何标记。

初始

尝试这个

<select class="form-control" 
    ng-model="t.selected" 
    ng-options="option | matriseValgFilter as option | matriseValgFilter for option in t.Valgalternativer" 
    ng-change="change(t.selected)"
    ng-init='t.selected = "99 - Annen utvendig kledning – må spesifiseres"'>
</select>

您选择的选项的viewValue应该与select选项之一的值匹配。

as语法用于为select中的选项设置值。 文档在这里

根据JavaScript,t.selected和t.Valgalternativer中的对象有所不同。 因为它们的哈希值不同。 Javascript仅比较哈希值是否相等。 只有我们的程序员才需要教Javascript,将其与“ Tekst”字段而不是“ $ hash”进行比较。
工作中的JSFiddle- https: //jsfiddle.net/Lt0cuwLd/6/

以下是我添加的唯一代码。 它只是遍历列表中的每个项目,并将其“ Tekst”值与t.selected的“ Tekst”值进行比较。 如果它们相等,则它将返回该对象,并将其分配给t.selected。 现在,t.selected的“ $ hash”值也匹配,而不仅仅是“ Tekst”。毕竟,所有计算机都不像人类那样聪明:)

$scope.t.selected = $scope.t.Valgalternativer.reduce(function(curr, next){
    if(next.Tekst === $scope.t.selected.Tekst) return next;
    else return curr;
}, {})

在我的实际应用程序中,没有一个答案能正常工作,但是使用我用ng-init调用的控制器中的方法解决了这个问题。

最终这样:

    <select class="form-control"  
            ng-init="loadMatriseValg(node, t)"
            ng-model="t.selected"
            ng-options="option | matriseValgFilter for option in t.Valgalternativer"
            ng-change="changeMatrise(node, t.selected, '{{t.selected.Kode}}')"></select>

然后在控制器中我有这个:

            $scope.loadMatriseValg = function (node, t) {

                // user has not selected anything, set default value
                if (!t.selected) {
                    t.selected = t.Valgalternativer[0];
                }

                // loop through all valg alternativer
                for (var v = 0; v < t.Valgalternativer.length; v++) {

                    if (t.Valgalternativer[v].Siffer == t.selected.Siffer) {

                        t.selected = t.Valgalternativer[v];
                        return;
                    }
                }

            }

这里的新小提琴:

https://jsfiddle.net/fiddlejan/wng2genw/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM