1

我有一个ng-class属性(不是我自己写的)。它绑定到控制器中的字符串变量。它看起来像:<some-tag ng-class="'indicator_' + $ctrl.stringValue"></some-tag>

当窗口首次加载时 - 它包含正确的数据,但在控制器中更新字符串后 -class属性中的值仅在我单击元素后更新(单击将打开一个列表,但我不认为这是相关的)。

我读过在这些情况下首先要检查的是代码是否被$scope.$apply. 是的,因为当我尝试添加它时 - 我收到一条错误消息“$digest 已经在进行中”。寻找$ctrlng-class信息,我阅读了AngularJS 组件文档这个网站,这给了我一些关于这些主题的基本背景。

问题是,我找不到ng-classwith的任何示例$ctrl。也许这无关紧要,但也许不是:)

我在主题中发现的一个不相关问题的示例是:Angular ngClass is not update my classes even if my condition change as expected。一般来说,我发现的大多数示例都包括大括号,我认为在这种情况下不相关,因为我正在绑定一个字符串(也许我弄错了:))。

我怀疑它可能没有正确绑定它,我只是不知道为什么。


编辑:

继续搜索该主题后,我不再确定它是否与ng-class(所以我也编辑了标题)。它看起来更像是一个刷新问题。

我对为什么页面不刷新感到困惑,因为在我阅读的所有地方 - 他们都说 Angular 应该自己调用摘要函数,我不应该干涉。

编辑2:

我正在使用typeScript,并stringValue通过服务中的事件进行更新。但是字符串确实更新了 - 所以我不确定它是否是理解问题的相关信息,但值得一提:)

4

2 回答 2

1

问题解决了!!:D

我所要做的就是$timeout(0)在更新控制器中的字符串后添加!

解释:这是一个摘要问题,我不能使用的原因$scope.$apply()是因为我试图直接这样做。我需要做一个安全的 apply,这意味着 - 首先确保该范围内没有摘要,然后运行 ​​apply。

事实证明,一个简单的方法是使用$timeout(0).

于 2016-08-04T09:05:31.160 回答
0

我用 Angular 1.5.7 准备了一个 plunker,其中包含你所描述的演示。似乎没有任何问题,或者您应该做任何特别的事情。(我为控制器使用了不同的别名,这是最佳实践,但 $ctrl 也可以正常工作。)

https://plnkr.co/edit/wCpBQ5?p=preview

const DemoComponent = {
  controller: DemoController,
  controllerAs: 'demoCtrl',
  template: `
    <h2 ng-class="'demo_' + demoCtrl.classSuffix">{{ demoCtrl.classSuffix }}</h2>
    <button ng-click="demoCtrl.changeClass()">Change Class</button>
    `
}

angular.module('myapp', [])
  .component('demo', DemoComponent);

如果您可以在 plunker 中重现该问题并发布链接,这将非常有帮助。否则,我希望你在这个 plunker 中找到答案。

于 2016-08-03T20:06:10.447 回答