2014-03-12 39 views
0

我有一個典型的項目/任務/子任務CRUD應用程序,並且可以從頂級項目列表一直導航到子任務。AngularJS和鏈接的資源 - 如果存在,從範圍獲取

所有資源都被路由,例如,

/projects獲得所有項目,

/projects/:id得到一個具體的項目,

/projects/:id/tasks讓所有任務特定項目,等等。

我渲染任務,像這樣:

<ul> 
    <li ng-repeat="task in tasks"> 
    <a href="/tasks/{{task.id}}"> 
     {{task.name}}</a> ... 

負責的/tasks/:id路由控制器獲取使用$routeParams從後端API的數據,但我想知道如何從信息我已經加載任務在範圍內我鏈接從,例如是這樣的:

<ul> 
    <li ng-repeat="task in tasks"> 
    <a href="/tasks/{{task.id}}" ng-click="useThisTaskInstead(task)"> 
    <!--         ^^^^^^^^^^^^^^^^^^  --> 
    <!--         set this in the 
              target scope.   --> 
     {{task.name}}</a> ... 

我想要的目標控制器如果task不在範圍只接觸後端API。

例如,地址欄中的URL也應該顯示爲http://example.org/tasks/5

UPDATE

東西我想這我不確定:

我有一個頂層ApplicationController中,我定義:

$scope.cacheTask: function (task) { 
    $scope.task = task; 
}; 

...然後在鏈接變爲:

<a href="/tasks/{{task.id}}" ng-click="cacheTask(task)"> 

...和在我的TaskController

if (typeof $scope.task !== 'undefined' && $scope.task.id == $routeParams.id) { 
     // nothing to do -- task already set in scope. 
     console.log("task already in scope"); 
    } else { 
     console.log("fetching task"); 
     // load task 
     $q.when(taskService.get($routeParams.id).$promise).then(function(task) { 
      console.log("task fetched from backend", task); 
      // set the task in scope 
      $scope.task = task; 
     }); 
    } 

回答

1

這應該在您的模型/持久性系統中處理。你的模型訪問層的API應該將緩存抽象出來,並且控制器/視圖可以隨着生活而開始(任何使用$scope對於非表示性東西都是有點味道的恕我直言)。

控制器和視圖應完全不知道持久狀態。讓他們使用Task.get(id)的方法比返回一個承諾。乾淨,而您的應用程序的其餘部分無論是從緩存還是新的HTTP請求承諾都不明智。

+0

對,所以不是讓'''cacheTask''設置範圍,而是在任務服務單例中設置一個緩存字段,然後每次調用taskService.get(id) ''? – opyate

+0

是 - 如果'task'是數據訪問層(或ActiveRecord-y的東西)。否則,它將在持久層中處理。 '$ http'和$ resource'都具有啓用緩存的非常簡單的方法。 – timruffles

+0

順便說一句 - 沒有必要用Service(或者Factory等)來後綴服務 - 服務是ng模塊系統的一個概念,而不是放在你的命名中的東西。 – timruffles