Angularjs 从外部JS访问角度模型实例?
My'ProjectsCtrl'包含此函数,用于将新项目添加到父资源:Angularjs 从外部JS访问角度模型实例?,angularjs,Angularjs,My'ProjectsCtrl'包含此函数,用于将新项目添加到父资源: $scope.addProject = function(client){ $scope.client = client; $scope.newProject.client_id = client.id; project = Project.save($scope.newProject); $scope.newProject = {}; } “client”参数取自视图,其中在ng repe
$scope.addProject = function(client){
$scope.client = client;
$scope.newProject.client_id = client.id;
project = Project.save($scope.newProject);
$scope.newProject = {};
}
“client”参数取自视图,其中在ng repeat=“client in clients”
块中有一个ng submit=“addProject(client)”
在另一个.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(项目)代码>在控制器内,则其工作正常。如何从控制器外部获取对该客户端实例的引用?方法取决于上下文:
如果您试图从另一个angular controller更新模型,则可以使用angular服务(angular服务在应用程序中基本上是单例的),以便具有相同的模型引用
如果试图从角度范围之外调用方法,可以:
2.1。将控制器函数引用发布到全局命名空间(不是最佳选择)
2.2。使用任何事件分派机制并调用$scope.apply(function(){操纵您的模型});关于事件侦听器
最后,我将父资源的$index作为子对象上的模型属性传递,并使用它将其推送到正确的位置
e、 g
每当需要在应用程序的不同部分之间绑定数据时……使用服务存储数据,在需要访问的地方注入服务。或者,可以广播包含以下内容的事件:data@charlietfl这难道不会让我面临同样的问题,需要从外部访问模型实例吗?或者我误解了你。这是我第一次尝试Angular。可以将所有数据存储在一个全局数组中,然后将该全局数组传递给Angular。将其他文件中的内容用作角度会更理想service@charlietfl我希望避免更新整个数据集,只更新视图中插入新数据的小区域。我正在尝试实现2.2,但我需要将数据插入嵌套资源,因此我需要对父实例的引用。当我在angular controller(其中客户端是父资源)中设置$scope.client=client时,angular作用域之外的事件侦听器回调无法获取该客户端实例。请尝试以下操作:$scope.addProject=function(client){$scope.apply(function(){$scope.client=client;$scope.newProject.client_id=client.id;project=project.save($scope.newProject);$scope.newProject={};}
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);
});