【问题标题】:Angular JS: Unable to set value to ng-model variable inside ng-repeatAngular JS:无法在 ng-repeat 中为 ng-model 变量设置值
【发布时间】:2014-10-05 20:25:09
【问题描述】:
  1. 我的以下代码运行良好。也就是说,它正在显示带有国家名称的组合框,当我在组合框中选择一个国家时,它会打印“过滤数据:”

        <span class="input-group-btn">
            <button type="button" class="btn btn-default" ng-click=""><i class="glyphicon glyphicon-globe"></i>&nbsp;Country</button>
            <select class="form-control" style="width:200px;" ng-model="filters" ng-options="country.name for country in countries"></select>
        </span>
    
        Filter Data: {{filters}}
    
    </div>
    

    在上面的代码中,我使用 ng-init="filters" (而不是通过 Controller )声明了一个范围变量,并且我试图将选定的组合项设置为这个变量。效果很好。

  2. 然后我将上面的代码替换为以下 ng-repeat 代码:

        <span ng-repeat="filter in filterList">
            <button type="button" class="btn btn-default" style="width:75px" ng-click="">{{filter.filterLabel}}</button>
    
            <span ng-switch="filter.filterType">
                <span ng-switch-when="combo"><select class="form-control" style="width:200px" ng-model="filters" ng-options="country.name for country in filter.countryData"></select></span>
            </span>
        </span>
    
        Filter Data: {{filters}}
    
    </div>
    

    上面的代码虽然在组合框中显示了国家名称,但当我选择一个国家时,它不会在“过滤数据”附近显示任何内容。我认为可能是范围变量“过滤器”在 ng-repeat 附近不可见(只是一个猜测),因此也尝试了它也没有工作。

问题:

  1. 您能帮我理解为什么 ng-model="filters" 没有设置范围变量 'filters' 并让我打印它吗?

  2. 我还想在 ng-model 中动态创建变量名。像 ng-model="filters.{{filter.filterType}}" 这样的东西。我试过了,但从来没有得到任何结果。它没有显示 {{filters}}。在浏览了 Stackoverlow 上的一些帖子后,我尝试了 ng-model="filters.[filter.filterLabel]"。当我在国家组合中选择一个项目时,这实际上是通过一些 JS 错误(说 TypeError: Cannot set property 'Country' of undefined)。似乎无法在过滤器中找到 Country (这是 [filter.filterLabel] 的结果)。因此,我声明 ng-model 的方式显然存在很大问题。

使用上面的代码(我想使用范围变量 ng-init="filters" ),你能帮我正确的方法来为所选项目动态生成 ng-model 变量名称并能够使用{{过滤器}}

更新:

这是演示我的问题的小提琴:http://jsfiddle.net/ramarajuv/ag2crnk7/ 请帮我改正。

提前谢谢大家。

【问题讨论】:

  • 根据文档,您不应该使用 ng-init,除非为 ngRepeat 的属性设置别名。如果 ng-init 不在 ng-repeat 上,我会将过滤器模型放在范围内。 "ngInit 唯一合适的用途是为 ngRepeat 的特殊属性设置别名,如下面的演示所示。除了这种情况,您应该使用控制器而不是 ngInit 来初始化作用域上的值。"跨度>
  • 始终在ng-model 中使用dotng-repeat 创建子作用域,您可能正在失去对原语的继承
  • stackoverflow.com/questions/18342917/… ng-switch +1 @charlietfl
  • 嗨......为了更好地提出我的问题,我创建了小提琴:jsfiddle.net/ramarajuv/ag2crnk7。你能帮我纠正一下吗?
  • @charlietfl 你介意更正我在小提琴中提供的代码吗?

标签: javascript angularjs angularjs-ng-repeat angular-ngmodel


【解决方案1】:

搞定了。

  1. 首先,在控制器范围内创建过滤器变量:

    $scope.filters = {
        "Country":{},
        "President of Country":{}
    };
    
  2. 然后,将 ng-model 格式化为:

    ng-model="filters[filter.filterMap]
    

【讨论】:

  • 在堆栈上的所有其他答案中,出于某种原因,这个对我帮助最大。感谢您在此处添加最后一行,我终于能够让嵌套在 ng-repeat 中的 ng-model 工作。现在只需要弄清楚如何让我的评论框的多次迭代与我初始化的ng-model变量的内容不一样...+1,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多