0

在我的 HTML 模板中,我有以下内容:

<a ng-href="{{ person | personLink }}">

person在控制器中设置为:

$scope.person = Person.get({examId: $routeParams.personId});

并且Person是一种资源:

  app.factory('Person', [
    '$resource', function($resource) {
      return $resource('/api/people/:personId/', {
        personId: '@personId'});
    }
  ]);

问题是过滤器在承诺准备好之前被调用并导致读取未定义的值。处理这个问题的正确方法是什么?

现在我对属性使用 if 检查,但这似乎并不理想:

renderFilters.filter('personLink', function() {
  return function(person) {
    if(person.ages) {
        return '#/ages/' + person.ages;
    }else{
        return '#';
    }
  };
});
4

2 回答 2

1

可以像这样访问承诺:

    Person.get({examId: $routeParams.personId}).$promise.then(function(p) {
                   $scope.person = p; 
      });

但是您的问题似乎是过滤器的问题而不是承诺。由于它是数据绑定表达式的一部分,因此在初始化期间将使用空值调用它。

考虑一个测试用例,其中 Person.get 传递了一个不在您的数据库中的 personid。你仍然会得到一个未定义的错误。我不确定这是否可以通过访问承诺来解决。您可能仍然需要在过滤器中处理它。我会将过滤器中的 if 条件更改为:

    if(person)
       return '#/ages/' + person.ages;
    else
       return "#";

另一种选择是在控制器 init 中使用一些虚拟数据来初始化 person 对象。喜欢:

     $scope.person={"ages":"#"};

我不认为这是一个干净的解决方案。

于 2014-07-17T04:23:35.300 回答
0

“正确”的方法是ng-if在数据准备好之前阻止元素显示。不在您的 JS 中,而是在您的 HTML 中。基本上就是这样。这可以根据您想要的实现进行微调,所以如果您想要一些特别的东西,请让我们确切地知道您的目标是什么。

于 2014-07-15T02:28:56.807 回答