2013-11-27 50 views
0

我在嘗試構建類似Rails方式的路線。我具有類似於這個一些路線設置:

$routeProvider.when('/posts', { 
    controller: 'PostsCtrl', 
    templateUrl: '/views/posts.html' 
}); 
$routeProvider.when('/posts/new', { 
    controller: 'PostsCtrl', 
    templateUrl: '/views/posts.html', 
    doNew: true 
}); 
$routeProvider.when('/posts/:postID', { 
    controller: 'PostsCtrl', 
    templateUrl: '/views/posts.html' 
}); 
$routeProvider.when('/posts/:postID/edit', { 
    controller: 'PostsCtrl', 
    templateUrl: '/views/posts.html', 
    doEdit: true 
}); 

PostCtrl在底部具有以下內容:

if ($routeParams.doNew) { 
    console.log('action: new'); 
} else if ($routeParams.doEdit) { 
    console.log('action: edit', $routeParams.postID); 
} else if ($routeParams.libraryID) { 
    console.log('action: show', $routeParams.postID); 
} else { 
    console.log('action: index'); 
} 

action: show當路徑是/posts/new/posts/2/posts/2/edit被打印。我可以過濾哪些控制器路由到適當的操作?

+0

99%您應該爲每條路線創建單獨的控制器。 –

+0

這不一定是真的。擁有不同控制器的原因是如果他們在示波器上設置的數據是根本不同的。對於像new,edit這樣的東西,顯示它幾乎是相同的,所以重用相同的控制器是有意義的。 '列表'視圖可能不同,並保證它是自己的控制器/模板。 – dtabuenc

回答

1

我想通了一個更容易實現Rails啓發的行爲。

定義路線:

$routeProvider.when('/posts', { 
    templateUrl: '/views/posts/index.html', 
    controller: 'PostsCtrl' 
}); 
$routeProvider.when('/posts/new', { 
    templateUrl: '/views/posts/index.html', 
    controller: 'PostsCtrl', 
    action: 'new' 
}); 
$routeProvider.when('/posts/:postID', { 
    templateUrl: '/views/posts/index.html', 
    controller: 'PostsCtrl', 
    action: 'show' 
}); 
$routeProvider.when('/posts/:postID/edit', { 
    templateUrl: '/views/posts/index.html', 
    controller: 'PostsCtrl', 
    action: 'edit' 
}); 

然後添加一個事件處理程序$routeChangeSuccess

app.run(['$rootScope', '$route', function ($rootScope, $route) { 
    $rootScope.$on('$routeChangeSuccess', function (currentRoute, previousRoute) { 
    if ($route.current.action) { 
     $rootScope.action = $route.current.action; 
    } 
    }); 
}]); 

然後在你的控制器,你可以在$scope.action分支:

if ($scope.action === 'new') { 
    $scope.newPost(); 
} else if ($scope.action === 'show') { 
    Post.get($routeParams.postID).then($scope.showPost); 
} else if ($scope.action === 'edit') { 
    Post.get($routeParams.postID).then($scope.editPosts); 
} 

通常情況下,我可能將爲這些路線分開控制器,但是在我正在建立的應用上; new,show,edit以模式顯示在所有「帖子」的索引上。

2

你可以很容易只需添加一個決心:

$routeProvider.when('/posts', { 
    controller: 'PostsCtrl', 
    templateUrl: '/views/posts.html' 
    resolve: { 
     action: function(){return 'list';} 
    } 
}); 
$routeProvider.when('/posts/new', { 
    controller: 'PostsCtrl', 
    templateUrl: '/views/posts.html' 
    resolve: { 
     action: function(){return 'new';} 
    } 
}); 

等。

那麼你可以注入action到控制器中:

controller('PostCtrl', function($scope, action){ 
    if(action==='new'){ 
     console.log('new'); 
    } 
}); 
+0

添加'決定'工作,但似乎真正羅嗦完成。如果當前路由定義了一個動作,我只會看'$ routeChangeSuccess'並設置'$ rootScope.action'。 – ravinggenius

+0

請記住,您也可以將$ route添加到您的控制器中 – dtabuenc

相關問題