【问题标题】:How to update ng-class based on ng-change?如何根据 ng-change 更新 ng-class?
【发布时间】:2015-03-18 15:32:39
【问题描述】:

我有一个 ng-repeat 可以创建多个小部件,每个小部件都有自己的选择下拉菜单。

<div ng-repeat="item in widget.items" class="col-md-6">
    <select ng-model="item.chosenTag"
            ng-change="widget.updateTag(item)"
            ng-class="widget.getButtonClass(item.tag, item.id)">

        <option value="companies"
                ng-selected="{{item.tag == 'companies'}}"
                changed="companies">companies</option>

        <option value="news"
                ng-selected="{{item.tag == 'news'}}"
                changed="news">news</option>

        <option value="people"
                ng-selected="{{item.tag == 'people'}}"
                changed="people">people</option>
    </select>
</div>

加载视图时,ng-class="widget.getButtonClass(item.tag, item.id)" 调用一个函数来检查是否满足 2 个值,然后将 ng-class 设置为 btn-successbtn-default

// This checks the view after load to change the class on each widget select
var vm = this;
vm.getButtonClass = function(tag, id) {

    console.log('in getButtonClass');

    if (tag && id) {
        return 'btn-success';
    } else {
        return 'btn-default';
    }
};

接下来,如果用户现在更新任何小部件中的选择,ng-change 将更新为正确的值。

但是我需要以某种方式重新运行ng-class 检查,或者直接将btn-success 添加到选择中,而无需刷新页面。

您将如何完成这项工作?

有没有办法做这样的事情?

ng-class="{ functionToUpdateAll | boolean based on ng-change }"

【问题讨论】:

  • 你有这方面的 plnkr/fiddle 吗?

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


【解决方案1】:

是否有任何特定原因需要调用该函数?为什么不直接绑定这些变量?

ng-class="'btn-success':item.tag && item.id, 'btn-default': !(item.tag && item.id)"

通过这种方式,您可以利用相互绑定,即每当 item.tag 或 item.id 更改时,都会对类进行相应的评估。

【讨论】:

  • 我最初是这样做的,但被告知不要考虑逻辑,但现在由于我的新问题,可能不得不恢复这样做......
  • 这不是逻辑,而是特定于 UI 的代码。即您正在决定 HTML 元素的类别。无法获得比这更多的 UI。
  • 好的,这与之前的功能相同,但是它不会即时更新 ng-class,如果我对select / ng-change 进行更改,有没有办法将两者结合起来?或者甚至只是假添加btn-success 进行任何更改?如果用户刷新,他们将获得正确的数据来设置所有选择的类。
  • hmm...这必须工作,除非您的代码有问题...您有 plunker 吗?顺便说一句,您始终可以观看“item.tag + item.id”并更新一个名为(例如 item.cssClass)的新变量并将其用作您的类。除非必要,否则我不会这样做。
  • 啊它不起作用,因为 id 是在更改命中数据库之后设置的用户 id,所以我现在必须使用这个 hack:item.id = 1; 在我的 updateTag 函数中。但是,您在页面上带有ui-logic 的代码使我能够即时更新代码以及页面加载:)
【解决方案2】:

我建议不要调用ng-class中的函数,而是将其分配给一个变量:

<select ng-model="item.chosenTag"
            ng-change="widget.updateTag(item)"
            ng-class="mySelectClass">

并在控制器中的 updateTag 函数中更新该变量:

vm.updateTag = function(item) {

    if (item.tag && item.id) {
        vm.mySelectClass = 'btn-success';
    } else {
        vm.mySelectClass = 'btn-default';
    }
};

【讨论】:

  • 这很好,但是有两个问题。当页面加载时,我无法调用当前的 ng-class 函数来根据以前的数据设置所有选择类。第二,更改此设置会将btn-success 添加到每个小部件中的每个选择中。
  • @LeonGaban 哦,不知道你有几个小部件,我的错。关于您的第一个问题-您不能在控制器初始化上运行一个函数来设置初始值吗?第二个问题 - 我会为不同的小部件创建不同的变量。您可以拥有ng-class="mySelectClass{{$index}}"。您还可以拥有ng-init="setInitialValue()" 并为每个小部件设置初始值。这实际上也解决了问题 #1。
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
相关资源
最近更新 更多