从外部JS访问Angular模型实例?

时间:2013-11-20 17:55:03

标签: angularjs

我的'ProjectsCtrl'包含此功能,用于将新项目添加到父资源:

$scope.addProject = function(client){
    $scope.client = client;
    $scope.newProject.client_id = client.id;
    project = Project.save($scope.newProject);
    $scope.newProject = {};
}

“客户”参数来自视图,其中ng-submit="addProject(client)"块中有ng-repeat="client in clients"

在另一个.js文件中,我试图引用该客户端实例,以便在使用服务器端事件推送一些数据后更新视图。这是代码:

var pSource = new EventSource('/administration/projects/events');
pSource.addEventListener('projects.create', function(e){
    var project = $.parseJSON(e.data);
    var projectCtrl = angular.element($(".project-list")).scope();

    projectCtrl.$apply(function(){
        projectCtrl.client.projects.push(project);
    });
});

问题是项目总是附加到第一个客户端实例上,而不是传递给addProject()函数的项目。

如果我在控制器中执行client.projects.push(project);,那么它可以正常工作。如何从控制器外部获取对该客户端实例的引用?

2 个答案:

答案 0 :(得分:1)

方法取决于具体情况:

  1. 如果您尝试从另一个角度控制器更新模型,您可以使用角度服务(角度服务在应用程序中基本上是单例),以便具有相同的模型参考

  2. 如果您尝试从角度范围外调用方法,您可以:

    2.1。将控制器函数引用发布到全局命名空间(不是最佳选择)

    2.2。使用任何事件调度机制并调用$ scope.apply(function(){操纵你的模型});在事件监听器上

答案 1 :(得分:0)

我最终将父资源的$ index作为子对象的模型属性传递,并使用它来推送到正确的位置。

e.g。

var clientCtrl = angular.element($(".client-list")).scope();
var project = $.parseJSON(e.data);
var projectCtrl = angular.element($(".project-list")).scope();

projectCtrl.$apply(function(){
    clientCtrl.clients[project.client_ix].projects.push(project);
});