将资源动态注入控制器-angularjs

将资源动态注入控制器-angularjs,angularjs,Angularjs,这项工作: 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.enti

这项工作:

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及时加载了vars?

是的,就是这样。无论作用域希望从资源或http调用获取数据,都会加载角度模板。据我所知,Angular要么监听$scope变量,要么使用一些神奇的方法触发重新加载模板渲染

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

如果出于任何原因,将值设置为$scope变量,而Angular没有注意到更改,则可以立即更新模板,然后可以调用:

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


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

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

服务:

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();
}

如果使用ng app指令,Angular将自动为app创建(一个)喷油器:(请参阅自动初始化部分)。所以,如果您正在使用ng应用程序,那么您将创建另一个喷油器。。。我想你会有问题的。一个应用程序应该只有一个注入器,通常你想要自动创建的注入器。为什么不坚持第一种获取依赖项的方法呢?一般来说,你不需要触摸angular的注射器,你应该让angular来做注射。请看,我已经尝试了$scope.$digest()和$scope.$apply()。事实上,它们抛出了一个“摘要已在进行中”错误,try/catch捕捉到了该错误——但是变量仍然没有呈现到模板中。我已经三次检查了模板语法。请按照以下步骤操作: