4

这有效:

function DetailsCtrl($scope, Plan){
    $scope.entities = Plan.query();
}

这不会:

function DetailsCtrl($scope){
    var injector = angular.injector(['myApp.services']);
    var name = 'Plan';
    var Entity = injector.get(name);

    $scope.entities = Entity.query();
}

在第二种情况下,不会引发错误,并且 console.log($scope.entities) 会转储加载的实体。但是变量没有在模板中呈现。我猜在用变量填充 $scope 之前正在加载模板。如果是这样,我如何确保 $scope 及时加载了变量?

4

2 回答 2

5

我创建了一个服务来动态加载资源:

服务:

var m = angular.module('myApp.services', ['ngResource']).
    factory('Entity',function($resource){
        return {
            Plan: $resource('/api/plans/:id',{id: '@id'})
        }
    }).
  value('version', '0.1');

控制器:

function DetailsCtrl($scope, Entity){
    $scope.entities = Entity['Plan'].query();
}
于 2012-09-10T21:30:27.210 回答
1

是的,情况就是这样。无论作用域是从资源中获取数据还是从 http 调用中获取数据,都会加载 Angular 模板。据我了解,Angular 要么监听 $scope 变量,要么有一些神奇的方法触发模板渲染的重新加载。

在这种情况下,也许 Angular 正在识别一个共享资源服务(计划模型)正在被传入,并且它期望它将用于获取一些数据。在第二个示例中,Angular 不知道您将在其中使用另一个服务,因此它不会为 $scope 变量准备任何回调或检查操作。

如果出于某种原因您为 $scope 变量设置了一个值并且 Angular 没有注意到更改,那么您可以立即更新您的模板,然后您可以调用它:

$scope.$digest(); //or $scope.$apply();

唯一的问题是,如果在它已经执行摘要操作时调用它,它会抛出错误(只需在语句周围使用 try/catch 分支)。

如果这不起作用,那么您将需要仔细检查模板本身是否具有正确的表达式语法。

于 2012-09-10T05:07:36.093 回答