2013-11-20 68 views
0

我「ProjectsCtrl」包含此功能添加一個新的項目,以父資源:從外部JS訪問Angular模型實例?

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

的「客戶」的說法是從面向視圖,其中我有一個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(project);,那麼它工作正常。我如何從控制器外部獲得對該客戶端實例的引用?

+1

無論何時需要在應用的不同部分之間綁定數據....使用服務來存儲數據,注入無論何時需要訪問的服務。或者可以廣播一個包含數據的事件 – charlietfl

+0

@charlietfl這不會讓我面臨需要從Angular之外訪問模型實例的相同問題嗎?或者,也許我誤解了你。這是我第一次進入Angular。 – aperture

+0

可以將所有數據存儲在全局數組中,將該全局數組傳遞給角。將其他文件中的內容用作角度服務會更理想 – charlietfl

回答

0

我最終將父資源的$索引作爲模型屬性傳遞給子對象並使用它推送到正確的位置。

例如

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

的方法取決於上下文:

  1. 如果你想更新從另一個角度控制器的模型,你可以以有使用角服務(角服務基本上都是在申請單身)相同的模型參考

  2. 如果你正試圖從角範圍您可以外調用一個方法:

    2.1。將您的控制器功能參考發佈到全局名稱空間(不是最佳選擇)

    2.2。使用任何事件調度機制並調用$ scope.apply(function(){操作你的模型});關於事件監聽器

+0

我想實現2.2,但我需要插入數據到嵌套的資源,所以我需要對父實例的引用。當我在我的角度控制器中設置$ scope.client = client時,客戶端是父資源,我的角度範圍外的事件偵聽器回調無法獲取該客戶端實例。 – aperture

+0

試試這個:$ scope.addProject = function(client){$ scope.apply(function(){ $ scope.client = client; $ scope.newProject.client_id = client.id; project = Project.save( $ scope.newProject); $ scope。newProject = {}; })} –

+0

返回'$ apply already in progress' – aperture