2013-11-27 69 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天内完成此操作,一旦我能够做到,我将确保做到这一点。 再次感谢! –