2014-02-14 39 views
0

試圖圍繞我的頭爲什麼這是行不通的。當我有我的$ http.get在我的控制,我可以存儲在JSON文件的數字轉換成數組元素,像這樣:Angular.js:爲什麼數組元素只在使用工廠時等於null?

$http.get('weapon.json').success(function(data) { 
    $scope.weapons = data; 

    for(i=0, len=$scope.weapons.length; i < len; i++){ 
     $scope.weapons[i].ele = $scope.elementType[$scope.weapons[i].ele]; 
    } 
}); 

但是,當我試圖將我的$ http.get到工廠,$ scope.weapons [i] .ele等於null而不是數組元素。

.factory('WeaponData', function($http){ 
    return $http.get('weapon.json'); 
}) 

.controller('BL2Ctrl', function($scope,WeaponData) { 
    WeaponData.success(function(data) { 
     $scope.weapons = data; 

     for(i=0, len=$scope.weapons.length; i < len; i++){ 
      $scope.weapons[i].ele = $scope.elementType[$scope.weapons[i].ele]; 
     } 
    }); 
}) 

這裏是一個Plunker它不工作

回答

1

的問題是,你的控制器被實例化的3倍。因此,其構造函數正在運行3次,並且從$http.get返回的data正在更新3次(因爲您設置了success處理程序3次)。第一次後,它有你想要的價值;將2,3和3替換爲您的elementType列表中的相應對象。問題是調用第二次和第三次處理程序時,列表會再次更新,但ele屬性已被覆蓋。因此,它將更新爲undefined,因爲沒有elementType對象的屬性與密鑰[object Object](或任何字符串值最終存在)匹配的屬性。有幾種方法可以解決這個問題:

  1. 創建一個更大的工廠並將更新推送到工廠。 http://plnkr.co/edit/CSv3ZRSL9K3bOcc9fcMJ
  2. 在視圖中使用elementType[weaponStats.ele],而不是更新模型。 http://plnkr.co/edit/UqVz88hVvNATO42A2Aew
  3. 更新不同的屬性(例如eleType)而不是覆蓋ele。這將防止您丟失從JSON加載的值。 (你仍然可以更新的對象3次)。http://plnkr.co/edit/EqbXUT6gCthtGbC7VQHO

在一個單獨的說明,我注意到,您的控制器綁定到ng-repeat圍繞<div> S的一個,但你也聲明,該控制器對於weaponblock指令是相同的控制器。這意味着即使您不需要,您也可以爲每條指令重做所有這些工作。這裏是一個部分重寫,它將單個控制器分成1個控制器來設置數據,還有一個單獨的控制器來設置指令的功能:http://plnkr.co/edit/6NpcuZLJutdC9rtwhJXd

+0

1.不確定如何使用weaponStats.ele工廠。歡迎小姐交流。我以前的工作方式是沒有工廠服務。像這樣[Plunker](http://plnkr.co/edit/erd0FcMqUZq1Qz5CzF1G) – mjoconnor

+0

對不起,我誤讀你的描述。我會更新我的答案。 – squid314

+0

1.不知道我會如何在工廠使用weaponStats.ele。歡迎小姐交流。我以前的工作方式是沒有工廠服務。像這樣[Plunker](http://plnkr.co/edit/erd0FcMqUZq1Qz5CzF1G)2.我之前嘗試過這種方式,但它打破了選擇下拉菜單。這有效,但它是最有效的方法嗎?我在JSON中傳遞了我想要的整個elementType屬性,但是我用這個數字來解決另一個問題,我選擇了weaponStats.ele,在視圖中默認爲空白。 – mjoconnor

相關問題