AngularJS 指令之 ng-style


用途

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”字體是什么顏色?
黃色應該是比較合理的顏色吧?紅色也說得過去,畢竟最后一次沒改么! 然而,事實上是系統默認色(黑色),因為被抹殺了 :(

不理解源代碼出於什么考慮,按我理解,應該按照下面兩個方案之一來實現:

  1. 初始化時,備份用戶自定義style。監視表達式,變化,恢復用戶自定義style,然后再用新定義的style覆蓋。上例中,字體顏色應該為黃色。
  2. 不做抹殺處理,直接進行style覆蓋。

回避方案,表達式中css 屬性清單始終保持一致。

有人可能會問為啥用了ng-style還要用style屬性?  

答:ng-style設置是為了減少頁面初始化后到angularjs處理階段頁面閃爍的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM