2013-11-27 70 views
1

編輯: 該問題是由於嘗試使用ng-repeat \ ng-options迭代函數的返回值而不是將數據解析爲常規對象一個承諾。在DOM(html)上下文中使用角度範圍函數時出現問題

代碼:

$scope.layout.getPartialUriSafe = function(){ 
     return $sceDelegate.getTrusted($sce.RESOURCE_URL, $scope.layout.getPartialUri()); 
    } 

$scope.layout.getPartialUri = function(){ 
    var cat = $location.search().cat; 
    switch(cat){ 
     case 'settings': 
      return 'partials/companySettings.html'; 
     case 'scouters': 
      $scope.model.roleType = 'scouter'; 
      $scope.layout.roleTitle = $filter('translate')('SCOUTERS'); 
      return 'partials/roles.html'; 
     case 'recruiters': 
      $scope.model.roleType = 'recruiter'; 
      $scope.layout.roleTitle = $filter('translate')('RECRUITERS'); 
      return 'partials/roles.html'; 
     case 'social': 
      return 'partials/socialLinks.html'; 
     case 'design': 
      return 'partials/companyDesign.html'; 
     default: 
      return 'partials/companySettings.html'; 
    } 
} 

HTML:

<div class="settingsInnerContainer"> 
    <div data-ng-include data-src="layout.getPartialUriSafe()"></div> 
</div> 

上述凍結,沒有錯誤的畫面。

使用的插補值

'{{layout.getPartialUriSafe()}}' 

嘗試,但後來我的角分析器錯誤。

還試圖用一種原始的插值,但沒有運氣也:

'{{layout.getPartialUriSafePrimitive}}' 

layout.getPartialUriSafePrimitive - 包含了部分URI的字符串。

預先感謝任何幫助,我一直在嘗試了一段時間升級到NG的1.2.x,到目前爲止遇到的是在1.2.2解決了許多問題,但這一具體問題仍然開放。

回答

1

儘管我會分享我的回答,因爲我聽到許多開發者抱怨從1.0.x遷移到1.2.x時遇到困難:

看來我試圖用ng-options來遍歷函數返回值,其中有一些邏輯,Angular不喜歡它。

與其他MVC框架不同,angular使用髒檢查而不是函數來更新DOM,所以在Angular中對DOM(partials)中的函數進行渲染\迭代通常是一種糟糕的做法,在更高版本的angular中,可能會掛起你的應用程序。

我在我的companySettings類似的東西。HTML文件:

<select name="industry" class="filedExpand" data-ng-model="model.formData.industry" data-ng-options="industry.id as industry.name for industry in model.industries()" data-ng-required="true"> 
    <option value=''>{{'INDUSTY' | translate}}</option> 
</select> 

,並在控制器內的功能是:

$scope.model.industries = function(){ 
    if($scope.model.industryList){ 
    return $scope.model.industryList; 
} 

regService.getIndustries().then(function(data){ 
    $scope.model.industryList = data.data; 
    return data.data; 
}, 
function(data){ 
    console.log('error fetching industries'); 
}); 
} 

更改爲:

<select name="industry" class="filedExpand" data-ng-model="model.formData.industry" data-ng-options="industry.id as industry.name for industry in model.__industries" data-ng-required="true"> 
    <option value=''>{{'INDUSTY' | translate}}</option> 
</select> 

控制器:

$scope.model.getIndustries = function(){ 
     var deferred = $q.defer(); 
     var industries = regService.getIndustries(); 
     if(industries){ 
      // console.log($scope.model.industryList); 
      deferred.resolve(industries); 
      return deferred.promise; 
     } 

     regService.loadIndustries().then(function(data){ 
      // $scope.model.industryList = data.data; 
      regService.setIndustries(data.data); 
      deferred.resolve(data.data); 

     }, 
     function(data){ 
      // console.log('error fetching industries');//supress 
      deferred.resolve([]); 
      regService.setIndustries([]); 
     }); 
     return deferred.promise; 
} 

$scope.model.getIndustries().then(function(data){ 
    $scope.model.__industries = data; 
}); 
2

有一個API變化(小寫字母不幸)。檢查文檔1.1.5$location.search()latest - 1.2.x。 (拼圖:你能看出其中的區別?)

search(search, paramValue)

在1.1.5 search參數是可選的,在1.2.x的它是不是!所以,試試這個:

var cat = $location.search("cat"); 

或者,如果你不介意加入依賴性$routeParams(它不產生一個函數調用,可能是更好的性能 - :-)幾納秒

var cat = $routeParams.cat; 
+0

謝謝你的回答尼克斯,併爲信息。 它似乎雖然我的具體問題是試圖通過函數(這是返回一個列表)ng重複迭代。 我會發表一個答案,你可以告訴我,如果它有任何意義。 再次感謝! –

+0

@OlegTikhonov是的,這是有道理的。我從遍歷UI的函數調用時遇到過類似的麻煩。我建議你將答案標記爲解決方案,以便其他人知道。 –

+0

我將只能在2天內完成此操作,一旦我能夠做到,我將確保做到這一點。 再次感謝! –