angularJS實踐過程中出現的問題總結


同名服務

  在一次項目里,之前是同事寫的。我有一次在異步獲取服務器上的數據時,習慣把api地址寫在一個服務Store里,但是程序總是返回Store.api.get()里的get is undefined。知道肯定是Store.api為空造成的原因;但是覺得應該是沒有問題的才對,最后看到在頁面里又重新定義了一次Store服務,所以造成了覆蓋。

myApp.factory('Store',function(){
    return{
        name:'zhang',
        age:25
    }
})
myApp.factory('Store',function(){
    return{
        name:'dong',
        age:27
    }
})  //服務同名了,所以只有最后一次的Store服務有效

建議:在項目大的時候,將項目邏輯分成多個模塊,在每個模塊里寫服務和邏輯。然后在注入到其他模塊中,便於測試和邏輯清晰;

在查找錯誤上,使用先看看服務對象的輸出

對象復制

  如果將一個對象賦值給其他對象,無論賦值多少次,最后被賦值的對象都來自同一個對象的引用。

var a={}; 
var b=a; 
b.name='zhang'; 
a.name    //"zhang"
var a={};
var b={};
a==b    //false

在angularJS中,如果不想要引用的傳遞,但是又想獲得對象里的數據。可以使用angular.copy(),使用forEach() 方法,把對象里的屬性和值重新復制到一個新的對象上;但是又不等於被賦值的對象; var關鍵詞的作用就是在內存中新開一塊地址吧

ng-select

angularJS中的select不像HTML代碼里自己手動添加option,畢竟使用了指令,擴展了select的功能。

select元素使用ng-options生成下拉選項,只需要提供一個數組給ng-options就好,如果需要提供默認值,需要給select的綁定模型變量賦值

使用ng-options的時候必須給select綁定模型變量ng-model,否則會出錯誤:[$compile:ctreq] http://errors.angularjs.org/1.5.2/$compile/ctreq?p0=ngModel&p1=ngOptions

<div ng-controller="myController">
    <select ng-model="glass" ng-options="o.op as o.type for o in operation">
    </select>
</myController>
<script>
myApp.controller('myController', function($scope){
    $scope.operation=[
        {type: '大於', op: '>'},
        {type: '大於等於', op: '>='},
        {type: '小於等於', op: '<='},
        {type: '等於', op: '='},
        {type: '小於', op: '<'},
        {type: '不等於', op: '<>'},
        {type: '包含', op: ',like'},
        {type: '不包含', op: 'notlike'}
    ];
})
</script>

但是你查看源代碼就會看到,angularJS自動在option的value屬性里把value值前加了字段類型

<option label="大於等於" value="string:>=">大於等於</option>

也可以自己手動添加option

<select ng-model="glass">
    <option value="1">one</option>
    <option value="2">two</option>
</select>

Note:麻煩就是手動添加的option的value都是字符串,初始化的時候,$scope.glass="必須是引號引起來的字符串"; 但是ng-select就比較靈活了,使用ng-options就可以給value傳基本類型(數字,字符串,布爾值)和對象類型,在初始化的時候賦對應類型的值,調用的時候也獲取的是對應類型的數據;

<select ng-model="glass" ng-options="o.id as o.name for o in num" class="ng-pristine ng-valid ng-not-empty ng-touched">
    <option value="?" selected="selected"></option>
    <option label="one" value="boolean:true">one</option>
    <option label="two" value="boolean:false">two</option>
</select>
<select ng-model="glass" ng-options="o.id as o.name for o in num" class="ng-pristine ng-untouched ng-valid ng-not-empty">
    <option value="?" selected="selected"></option>
    <option label="one" value="number:1">one</option>
    <option label="two" value="number:2">two</option>
</select>

添加同一個對象

在表格中,為表格新建一行,並提供一個默認值屬性字段

<tr ng-repeat="user in users">
    ...
</tr>

直接push一個對象到users就行了,如果在行中使用$index,但是push到users里的對象是同一個對象(同一個對象的引用)就會出錯

Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys

可以根據官方的解決方案,使用ng-repeat="user in users track by $index";




免責聲明!

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



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