2014-04-03 268 views
2

我在做什麼: 我想動態更新基於ngModel的指令中的AngularJS範圍。將數組轉換爲嵌套對象

小小故事: 我注意到Angular將我的ngModel字符串視爲字符串而不是對象。所以,如果我有這樣的:

ng-model="formdata.reports.first_name" 

如果我試圖拉ngModel的指示,並指派東西吧,我結束了$範圍[「formdata.reports.first_name」。它將它視爲一個字符串而不是嵌套對象。

我現在這樣: 我想通得到這個工作是將ngModel字符串分割成一個數組的唯一途徑,所以我現在有工作:

models = ["formdata", "reports", "first_name"]; 

該作品不錯,我能現在靜態長度使用動態值,如:

$scope[models[0]][models[1]][models[2]] = "Bob"; 

問題: 如何使日動態範圍動態的長度?我希望這可以擴展到100個嵌套的對象,如果需要,甚至只是1.

更新: 我能夠使用if語句來實現這個半動態,但我如何使用for循環,沒有「最大」?

if (models[0]) { 
    if (models[1]) { 
     if (models[2]) { 
      if (models[3]) { 
       $scope[models[0]][models[1]][models[2]][models[3]] = "Bob"; 
      } else { 
       $scope[models[0]][models[1]][models[2]] = "Bob"; 
      } 
     } else { 
      $scope[models[0]][models[1]] = "Bob"; 
     } 
    } else { 
     $scope[models[0]] = "Bob"; 
    } 
} 
+0

$ scope.formdata.reports.first_name是否在你的指令中工作? – Pete

+0

是的,數據綁定也可以。 – JoshT

回答

2

這是一個答案

我注意到角是治療我的ngModel字符串作爲一個字符串,而不是一個對象

require屬性添加到您的指令,然後添加第四個ctrl參數您的link功能

app.directive('myDirective', function() { 
    return { 
    require: 'ngModel', 
    link: function(scope, element, attributes, ctrl) { 
     // Now you have access to ngModelController for whatever you passed in with the ng-model="" attribute 
     ctrl.$setViewValue('x'); 
    } 
    }; 
}); 

示範:http://plnkr.co/edit/Fcl4cUXpdE5w6fHMGUgC

+0

哇,這非常有幫助。我知道我正在推翻這個! – JoshT

0

動態尋路:

var obj = $scope; 

for (var i = 0; i<models.length-1; i++) { 
    obj = obj[models[i]]; 
} 
obj[models[models.length-1]] = 'Bob'; 

顯然沒有檢查完成,所以如果路徑錯了,它會用一個錯誤失敗。我發現你的原始問題與角度可疑,也許你可以在這個方向探索一下,然後再訴諸於此解決方法。

+0

我這樣做,所以ng-model =「formdata.reports.first_name」可以更改爲「first_name」或「formdata.reports.fe.fi.fo.fum.first_name」而不會破壞我的指令。我不知道,也許我正在推翻東西? – JoshT

相關問題