我的'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);
,那么它可以正常工作。如何从控制器外部获取对该客户端实例的引用?
答案 0 :(得分:1)
方法取决于具体情况:
如果您尝试从另一个角度控制器更新模型,您可以使用角度服务(角度服务在应用程序中基本上是单例),以便具有相同的模型参考
如果您尝试从角度范围外调用方法,您可以:
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);
});