用途
ng-style 屬性用來設置元素的style屬性的css值。
<input type="button" value="set color" ng-click="myStyle={color:'red'}"> <input type="button" value="set background" ng-click="myStyle={'background-color':'blue', color: 'black'}"> <span ng-style="myStyle">Sample Text</span>
ng-style指定的表達式必須是個單層的json對象,key和value對應css屬性的名稱和值。注意如果css屬性名中有“-”連接符,需要用引號括起來。
還有一個比較令本人費解的用法,class里面指定:
<ANY class="ng-style: ;"> ... </ANY>
代碼里面和doc文檔里面,並沒有給出詳細的用法說明。在class中指定style? why?老版本的歷史遺留?那傳遞什么值呢,class名還是css style字符串?
工作原理
ng-style代碼比較簡單,調用jquery.css方法,將上次設置的css屬性移除(why?),添加新的css屬性。
ngstyle的核心代碼:
scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { if (oldStyles && (newStyles !== oldStyles)) { forEach(oldStyles, function(val, style) { element.css(style, '');}); } if (newStyles) element.css(newStyles); }, true);
等下!源代碼中,只監視attr.ngStyle?那doc中 “@restrict AC”怎么解釋,如何處理class中定義的ng-style?難不成在指令執行前會對class屬性做一個統一轉換處理?如果是這樣那豈不是幾乎所有的指令都支持class里面指定!費解,希望隨着閱讀代碼的增加,這些問題能夠找到答案。
遺留問題
ng-style代碼比較簡單,所以就帶來了一些問題。ng-style監聽的表達式變更的時候,把上次設置的style給清除,卻沒有恢復上次設置前的值,所以就有可能會把之前的style值給清除掉。
1 <body ng-app="" class="ng-scope"> 2 <input type="button" value="變更字體顏色" ng-click="myStyle={color:'red'}"> 3 <input type="button" value="變更背景顏色" ng-click="myStyle={'background-color':'blue'}"> 4 <input type="button" value="clear" ng-click="myStyle={}"> 5 <br> 6 <span ng-style="myStyle" style="color: yellow;">Sample Text</span> 7 <pre class="ng-binding">myStyle={}</pre> 8 9 </body>
上述代碼,“Sample Text”顯示成黃色,點擊“變更字體顏色”以及“變更背景顏色”后,猜猜“Sample Text”字體是什么顏色?
黃色應該是比較合理的顏色吧?紅色也說得過去,畢竟最后一次沒改么! 然而,事實上是系統默認色(黑色),因為被抹殺了 :(
不理解源代碼出於什么考慮,按我理解,應該按照下面兩個方案之一來實現:
- 初始化時,備份用戶自定義style。監視表達式,變化,恢復用戶自定義style,然后再用新定義的style覆蓋。上例中,字體顏色應該為黃色。
- 不做抹殺處理,直接進行style覆蓋。
回避方案,表達式中css 屬性清單始終保持一致。
有人可能會問為啥用了ng-style還要用style屬性?
答:ng-style設置是為了減少頁面初始化后到angularjs處理階段頁面閃爍的問題。