2016-08-11 74 views
0

外鍵我有兩個表:使用在NG-重複

  1. 一個工作表3個字段:idclient_idname
  2. A clients table with 2 fields:idname

採用了棱角分明1.5,我遍歷工作:

controller('JobsController', ['$scope', 'Job', 'Client', function($scope, Job, Client) { 
    $scope.jobs = Job.query(); 
    $scope.clients = Client.query(); 
}]); 

HTML:

<tr ng-repeat="job in jobs"> 
    <td> 
     {{clients[job.client_id].name}} 
    </td> 
    <td> 
     {{job.name}} 
    </td> 
</tr> 

在HTML的第一列應該是客戶端名稱。正因爲如此,這是行不通的,因爲$scope.clients是,看起來有點像這個對象的數組:

[{'id':4, 'name':'test_name'}, {'id':7, 'name':'another client'}]

有沒有辦法通過id從這個clients陣列挑,我ng-repeat循環?

$scope.jobs樣子:

[{'id':100, 'client_id': 4, 'name': 'a job'}, ...]

+0

如何$ scope.jobs樣子..? –

+0

添加示例'$ scope.jobs'。 – GluePear

+0

您的問題是您的$ scope.client數組中的客戶端按您在後端決定的任何順序進行分類。 你在這裏做的是取得你的客戶端數組的(job.client_id)st客戶端,這與客戶端沒有任何事情可以看到job.client_id客戶端。 您的解決方案只適用於客戶永遠不會被刪除,而clients_id實際上是正確順序的自然數,這是不好的。 創建一個函數來獲取數組中正確的客戶端然後調用它。 – Alburkerk

回答

1

首先,它可能是更容易做的加入在服務器端,到了那裏你$scope.jobs看起來更像:

[ 
{ 
    'id': 100, 
    'name': 'a job', 
    'client': { 
     'id': 4 
     'name': 'test_name' 
    } 
} 
... 
] 

如果您需要在前端執行此操作,我會做的是將一種方法添加到您的控制器以獲取指定作業的客戶端。事情是這樣的:

$scope.getClientName = function(job) { 
    //to prevent errors if $scope.clients is not loaded yet 
    if (!$scope.clients) { 
     return; 
    } 

    for (var c = 0; c < $scope.clients.length; c++) { 
     var client = $scope.clients[c]; 
     if (client.id = job.client_id) { 
      return client.name; 
     } 
    } 
} 

然後,而不是{{clients[job.client_id].name}}調用函數並傳入job

{{getClientName(job)}} 
+1

成功回調後加入兩個數組不是更好嗎? 因爲函數表達式會多次執行digestcylcle,所以性能會下降,不是嗎? –

+0

我相信這個函數直到'$ scope.jobs'數組中有一些數據纔會真正被調用,因爲這是重複的。儘管在函數的開始處添加一個條件可能是一個好主意,但如果'jobs'在'clients'之前加載的話。像'if(!$ scope.clients)return';' –

+0

@ThomasZoé完全同意。確保只有在初始化時(一個**單**時間)才能進行合併。 – developer033

0

你可以做到這一點在前端如下

$scope.clients = [{'id':1, 'name':'test_name'}, {'id':4, 'name':'another client'}]; 
$scope.jobs = [{'id':100, 'client_id': 4, 'name': 'a job4'}, {'id':100, 'client_id': 1, 'name': 'a job1'}, {'id':100, 'client_id': 24, 'name': 'a job24'}]; 
function fillJobsByClient(jobs, client){ 
    for(var i=0; i<jobs.length; i++){ 
     if(jobs[i].client_id == client.id){ 
      jobs[i].client = client; 
      delete jobs[i].client_id; 
     } 
    } 
} 

$scope.clients.forEach(function(client){ 
    fillJobsByClient($scope.jobs, client); 


}); 

console.log($scope.jobs); 
0

我知道這已經很晚了,但我認爲這可能有助於指向正確方向的其他人。這就是你如何在前端執行它,你應該加載你的數組OnInit,然後使用if語句來選擇正確的細節字段。

<tr *ngFor='let j of jobs'>  
 
    <td> 
 
    <div *ngFor='let c of clients'> 
 
     <div *ngIf='c.id== j.client_id'>{{j.name}}</div> 
 
    </div> 
 
</td> 
 
</tr>