2016-04-27 50 views
0

我無法顯示從模板中的服務返回的數組的項目。我相信我正確地使用控制器作爲語法,它用在我的控制器,模板以及我的.config()$狀態(ui-router)塊中。但由於某種原因,它不會在頁面上顯示任何內容。角度控制器沒有綁定服務對象屬性ng-repeat

我試着在chrome中進行調試,當我在控制器中放置一個斷點時,vm.processes持有對象(一個包含4個項目的數組,全部檢出),但在視圖中沒有顯示任何內容,這是奇數b/c vm。在控制器中公開任何內容,因此應該可以從模板中訪問它。

我定義了一個簡單的服務,返回JSON對象,我遇到了麻煩,使用抓取文件本身$ HTTP所以我選擇了硬編碼在服務文件中的值:

.factory('dataservice', function dataservice($http) { 
     return { 
      getProcesses: getProcesses 
     }; 

     function getProcesses() { 
      // return $http.get('data\processes.json') 
      //  .then(getProcessesComplete) 
      //  .catch(getProcessesFailed); 

      // function getProcessesComplete(response) { 
      //  return response.data.results; 
      // } 

      // function getProcessesFailed(error) { 
      //  console.log('Error retrieving processes. ' + error.data); 
      // } 

      return { 
       "processes": [ 
        { 
         "name": "mergeFiles", 
         "id": 1, 
         "description": "Merge files in /files on server 3", 
         "scheduledRun": { 
          "startTime": "2016-06-27T18:25:00", 
          "endTime": "2016-06-27T18:26:00" 
         } 
        }, 
        { 
         "name": "monthlyImport", 
         "id": 2, 
         "description": "Import records on server 1", 
         "scheduledRun": { 
          "startTime": "2016-06-01T12:00:00", 
          "endTime": "2016-06-01T18:05:00" 
         } 
        }, 
        { 
         "name": "tickeTrakBilling", 
         "id": 3, 
         "description": "...", 
         "scheduledRun": { 
          "startTime": "2016-06-27T19:15:00", 
          "endTime": "2016-06-27T18:20:00" 
         } 
        }, 
        { 
         "name": "batch092", 
         "id": 4, 
         "description": "run batch092.bat on server 4", 
         "scheduledRun": { 
          "startTime": "2016-06-27T1:25:00", 
          "endTime": "2016-06-27T11:26:00" 
         } 
        } 
       ] 
      }; 
     } 
    }); 

現在控制器使用控制器作爲語法編寫:

controller('ProcessController', ProcessController); 

function ProcessController(dataservice) { 
    var vm = this; 
    var dataService = dataservice; 

    vm.processes = dataService.getProcesses(); 
} 

所以現在的控制器應暴露JSON對象

模板如下:

<div class="container" ng-controller="ProcessController as vm"> 
<div class="job" ng-repeat="process in vm.processes"> 
    <!-- Header [Job Name] --> 
    <h3 class="job-name">{{ process.name }}</h3> 
    <!-- Body [Job details] --> 
    <div class="container"> 
     <p>{{ process.description }}</p> 
     <ul class="job-details"> 
      <li> 
       {{ process.scheduledRun.startTime }} 
      </li> 
      <li> 
       {{ process.scheduledRun.endTime }} 
      </li> 
     </ul> 
    </div> 
</div> 

狀態定義如下:

   .state('process', { 
       url: '/:month/:date', 
       templateUrl: '/app/templates/process.html', 
       controller: 'ProcessController', 
       controllerAs: vm 
      }); 

回答

0

您不能使用通過$routePovider$stateProviderng-controller一起定義controller as語法。在HTML模板中刪除您ng-controller,你的代碼將工作: HTML

<div class="container"> 
    <div class="job" ng-repeat="process in vm.processes"> 
    <!-- Header [Job Name] --> 
    <h3 class="job-name">{{ process.name }}</h3> 
    <!-- Body [Job details] --> 
    <div class="container"> 
     <p>{{ process.description }}</p> 
     <ul class="job-details"> 
     <li> 
      {{ process.scheduledRun.startTime }} 
     </li> 
     <li> 
      {{ process.scheduledRun.endTime }} 
     </li> 
     </ul> 
    </div> 
    </div> 
</div> 

而且在某些情況下controllerAs不起作用。在這種情況下,嘗試使用controller: ProcessController as vm語法

+0

我不知道一個人不能同時擁有這兩個進程,但它如果已經在$ stateProvider中定義了它,這是有意義的。不幸的是,這並沒有解決我的問題。這兩個李的節目,但除了兩個要點外,沒有任何內容。 – n0tion

+0

這是因爲您正在從服務中返回一個對象'{processes:[]}'並將其分配給'vm.processes'數組。將服務的響應改爲數組,或者在你的控制器中改變你的代碼爲'vm.processes = dataService.getProcesses()。進程' –

+0

哇,我完全錯過了。出於測試目的,您認爲最好保留對象並使用點符號訪問數組或僅從服務中返回數組 – n0tion

0

寫你的控制器這樣的檢查結果。

app.controller('ProcessController', ['dataservice', function(dataservie){ 
    var vm = this; 
    var dataService = dataservice; 

    vm.processes = dataService.getProcesses(); 
}]); 
+0

所以我試圖在註冊控制器時手動註釋依賴項,因爲它可能會變得混亂或者容易混淆順序。但是我這樣做了,它也沒有在視圖中顯示任何東西。我不確定可能是什麼問題 – n0tion

+0

將您的代碼上傳到plunker或jsfiddle,以便我可以幫助您。 – Laxminarayan

+0

我不得不改變一些代碼,因爲它依賴於與這個問題無關的其他文件。 https://plnkr.co/ZHCydSbiOOVKjRC6WCrf – n0tion

0

嘗試在您的控制器函數上方注入dataservice,如下所示。

ProcessController.$inject = ['dataservice']; 

所以你的控制器會是怎樣,

controller('ProcessController', ProcessController); 

ProcessController.$inject = ['dataservice']; 

function ProcessController(dataservice) { 
    var vm = this; 
    var dataService = dataservice; 

    vm.processes = dataService.getProcesses(); 
} 
+0

感謝您的答覆,我試着將數據服務傳遞給$ inject,但它仍然沒有顯示進程數組 – n0tion