2016-08-01 16 views
1

我有一個ng-class屬性(我沒有自己寫)。它綁定到控制器中的字符串變量。它看起來像:<some-tag ng-class="'indicator_' + $ctrl.stringValue"></some-tag>單擊元素後綁定僅更新,儘管控制器中的字符串已更新(角1.5)

當窗口第一次加載 - 它包含正確的數據,但在控制器中更新字符串後 - class屬性中的值僅在單擊元素後纔會更新(點擊將打開列表,但我不認爲這是相關的)。

我讀過的第一件事是檢查這些情況,是代碼被$scope.$apply包圍。這是,因爲當我嘗試添加它時 - 我收到一個錯誤,說「$ digest已在進行中」。 尋找$ctrlng-class信息,我讀了AngularJS component docthis site,這給了我一些關於這些主題的基本背景。

事情是,我找不到ng-class$ctrl的任何例子。也許它是不相關的,但也許不是:)

我在這個主題中發現一個不相關的問題的例子是:Angular ngClass is not updating my classes even though my condition change as expected。 一般來說,我發現的大多數例子都包括大括號,我不認爲這種情況是相關的,因爲我綁定了一個字符串(也許我誤解了它:))。

我懷疑它可能沒有正確綁定它,我只是不知道爲什麼。


編輯:

繼續搜尋主題後,我不再確信它涉及到ng-class(所以我編輯的標題爲好)。它看起來更像是一個刷新問題。

我很困惑,爲什麼頁面不刷新,因爲我讀到的每個地方 - 他們說,Angular應該自己調用摘要函數,我不應該干涉。

EDIT2:

我與typeScript工作,並stringValue通過從服務的事件更新。但字符串更新 - 所以我不知道這是一個相關的信息來了解問題,但值得一提的:)

回答

1

問題解決了!:D

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

解釋:這是一個消化問題,我不能使用$scope.$apply()的原因是因爲我試圖直接做。我需要做一個安全申請,這意味着 - 首先確保在該範圍內沒有摘要,然後運行apply。

原來,一個簡單的方法就是使用$timeout(0)

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中重現問題併發布鏈接。否則,我希望你能在這個掠奪者中找到答案。

+0

Shmool,謝謝你的回答,但在我的情況下 - 'stringValue'不會因用戶操作而更新 - 它會因代碼中發生的事情而更新。 – Yaara

+0

我也編輯了這個問題 - 我正在使用'typeScript',它是相關的.. 我無法重現該問題,因爲我正在處理其他一些服務,並使用其中一個來引發事件。 **但重點是 - **服務引發事件,控制器捕獲它並更新字符串(字符串更新!)。但在此之後 - HTML中的$ ctrl.stringValue'綁定不會更新,直到頁面刷新,並且它不會自行刷新。 – Yaara

相關問題