2016-11-03 65 views
3

我在一個小的Angularjs 1.5項目中工作,我很新。Angularjs 1.5 - CRUD頁面和組件

我必須創建一個對象或編輯一個現有的對象,並且模板是相同的,邏輯唯一的區別是在更新的情況下調用http服務進行數據檢索。 我使用ngRoute。 如何才能在兩種操作中使用相同的組件?

EDIT

JS分量代碼

angular. 
module('editProject'). 
    component('editProject', { 
     templateUrl: 'app/edit-project/edit-project.template.html', 
     controller:['$http','$routeParams', function EditProjectController($http,$routeParams) { 
      var self=this; 
      $http.get('rest/projects/' + $routeParams.id).then(function(response) { 
       console.log(JSON.stringify(response.data)); 
       self.project = response.data; 
      }); 


     } 
    ] 
    }); 

ROUTE CONFIG

angular. 
    module('myApp'). 
    config(['$locationProvider', '$routeProvider', 
    function config($locationProvider, $routeProvider) { 
     $locationProvider.hashPrefix('!'); 

     $routeProvider. 
    when('/projects', { 
     template: '<project-list></project-list>' 
    }). 
    when('/projects/:id', { 
     template: '<project-detail></project-detail>' 
    }). 
    when('/projects/edit/:id', { 
     template: '<edit-project></edit-project>' 
     }). 
    when('/projects/new', { 
     template: '<edit-project></edit-project>' 
    }). 
    otherwise('/projects'); 
} 
]); 
+0

請添加代碼來提問,以顯示您已經嘗試過的內容。 –

+0

添加到我的問題代碼 – Massimo

回答

2

1.快速修復

簡單的解決方案將被使用的條件檢查是否定義了$routeParams.id參數,如果是,則需要請求提供項目信息,否則請求。

if($routeParams.id){ 
    $http.get('rest/projects/' + $routeParams.id).then(function(response) { 
     console.log(JSON.stringify(response.data)); 
     self.project = response.data; 
    }); 
} 

2.組件路由器

即使以前的解決方案看起來簡單而實用,它可能不是最好的。 propper解決方案是爲每個路由使用一個單獨的組件,但您可以重新使用它的表單部分。另外,假設你正在構建一個完整的基於組件的應用程序,你應該使用ngComponentRoute而不是ngRoute

.component('app', { 
    template: '<ng-outlet></ng-outlet>', 
    $routeConfig: [ 
    {path: '/projects', name: 'Projects', component: 'projectList', useAsDefault: true}, 
    {path: '/projects/:id', name: 'Project Detail', component: 'projectDetail' }, 
    {path: '/projects/edit/:id', name: 'Edit Project', component: 'editProject' }, 
    {path: '/projects/new', name: 'New Project', component: 'newProject' } 
    ] 
}); 

然後,你可以創建一個項目編輯器組件和只需添加<project-editor-form project="{}" on-save="$ctrl.mySave()"></project-editor-form>重用兩個編輯和新建的項目頁面。例如:

.component('projectEditorForm', { 
    template: 
     'Project Name: <input type="text" ng-model="$ctrl.project.name">' + 
     '<button ng-click="$ctrl.onSaveProject($ctrl.project)">Save</button>', 
    bindings: { 
     project: '<', 
     onSave: '&' 
    }, 
    controller: function() { 
     var $ctrl = this; 
     $ctrl.onSaveProject = function (project) { 
      // general save logic goes here 
      // if you want to reuse this too 
      // then emit the on save for onSave binding 
      $ctrl.onSave($ctrl.project); 
     } 
    }, 
    }) 

.component('editProject', { 
    template: 
     '<project-editor-form project="$ctrl.project" on-save="$ctrl.mySave()">' + 
     '</project-editor-form>', 
    bindings: { 
     project: '<', 
     onSave: '&' 
    }, 
    controller: function ($http) { 
     var $ctrl = this; 

     // consider using a Service to do such task 
     // instead of request directly from the controller 
     $http.get('rest/projects/' + $routeParams.id).then(function(response) { 
      $ctrl.project = response.data; 
     }); 

     $ctrl.mySave = function (project) { 
      // save logic here 
     } 
    }, 
    }) 

3. ngRoute與決心

另一種方法不上ngComponentRoute deppend,是使用路線resolve屬性,它使用組件作爲路由模板時是非常有用的。您添加一個解析屬性到您的路線,這將是項目,並綁定到您的表單組件。

$routeProvider 
    .when('/projects/edit/:id', { 
    template: '<project-editor-form project="$resolve.project"></project-editor-form>', 
    resolve: { 
     project: function ($route, $q) { 
     var id = $route.current.params.id; 
     // again, consider using a service instead 
     return $http.get('rest/projects/' + id).then(function (response) { 
      return response.data; 
     }); 
     } 
    } 
    }) 
    .when('/projects/new', { 
    template: '<project-editor-form project="$resolve.project"></project-editor-form>', 
    resolve: { 
     project: { 
     id: 0, 
     name: '' 
     } 
    } 
    }) 
+0

非常好的建議!不幸的是,ngComponentRoute已被棄用,但我認爲不是問題。如果我想重複使用保存邏輯? – Massimo

+0

是的,它已被棄用,是的,這不是一個問題(你可以使用ngRoute,不幸的是它現在是組件路由,但它會工作得很好)。如果你想重新使用保存邏輯,你可以移動projectEditorForm中的保存邏輯,並構建保存邏輯,也可以考慮將保存邏輯移動到服務,並使用該服務調用組件的登錄名。 –

+0

@Massimo我用一個新的例子更新了我的答案,這是一種不同的方法,但它可以是有用的 –