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

时间:2012-09-10 05:00:46

标签: 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.entities = Entity.query();
}

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

是的,情况就是这样。无论是否期望从资源或http调用获取数据,都会加载Angular模板。根据我的理解,Angular要么监听$ scope变量,要么有一些魔术方法触发重载模板渲染。

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

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

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

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

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