2016-05-20 48 views
1

我有一個有趣的情況,我完全承認我可能沒有正確處理。如何從數據庫添加新的指令信息?

我想使用AngularAMD將指令加載到Angular應用程序中,但指令信息來自數據庫/ API調用。下面是我怎樣,我交給它的那一刻:

app.run(function ($rootScope, $state, $http) { 
    $rootScope.$state = $state; 
    $rootScope.rootPages = JSON.parse(localStorage.pages); 

    $http.get('api/Directives').then(function (resp) { 
     for (var i = 0; i < resp.data.length; i++) { 
      var dirInfo = resp.data[i]; 
      var dirConfig = JSON.parse(dirInfo.Configuration); 

      angularAMD.directive(dirInfo.Name, function() { 
       return { 
        restrict: 'E', 
        controller: eval(dirConfig.controller), 
        templateUrl: dirConfig.templateUrl, 
        scope: true, 
       } 
      }); 
     } 
    }, function (error) { 
     alert('error'); 
    }); 
}); 

這產生兩個指令的那一刻,我有我的網頁,一個在兩個環節爲每個模塊(採用了棱角分明的UI路由器和路由器的用戶界面-extras加載基於另一個數據庫表/ API調用的那些)。理論上點擊鏈接1應該出現指令1,鏈接2應該出現指令2.但是,當我點擊鏈接1時,指令2出現。這幾乎就像如果註冊的唯一指令是指導2. 這是我從數據庫中獲取的信息:

dirInfo1: { 
    Name: directiveOne, 
    templateUrl: /html/directiveOne.html, 
    controller: controllerOne 
} 

dirInfo2: { 
    Name: directiveTwo, 
    templateUrl: /html/directiveTwo.html, 
    controller: controllerTwo 
}  

在這種情況下,只有directiveTwo.html顯示,只有controllerTwo火災。

任何幫助將不勝感激。

回答

0

這是使用for循環延遲/異步操作的常見問題。 到第一個angularAMD.directive被解析的那一刻var dirInfo = resp.data[i];裏面的循環等於列表中的最後一個項目。

您需要在循環內部使用Promises或匿名函數來保持鏈接到正確的索引在異步函數內。檢查的簡單的例子,怎麼在這裏發生的事情,你的情況:https://stackoverflow.com/a/13977142/405623

for (i = 0; i < items.length; i++) { 
    (function(thisItem) { 
    setTimeout(function() { 
    console.log(thisItem); 
    }, i * 1000); 
)(items[i]); 
} 
+0

所以基本上我最終包裝的諾言環的內側,它現在不正是我需要它去。非常感謝你! – psywildfire

相關問題