2017-05-04 57 views
1

我對多個視圖使用相同的控制器。我想根據所採用的路線對控制器進行參數化。AngularJS:通過路徑參數化控制器

視圖基本上顯示相同的角度ui網格,因此是相同的控制器。然而,在一個視圖中,我想預過濾特定數據的網格,而在另一個視圖中,我沒有。

我該怎麼做?

app.config(function ($routeProvider) { 
    $routeProvider 
     .when('/foo', 
      { 
       controller: 'Ctrl', 
       templateUrl: '/foo.html', 
      }) 
     .when('/bar', 
      { 
       controller: 'Ctrl', 
       templateUrl: '/bar.html', 
      }); 
}); 

app.controller('Ctrl', ['$scope' function ($scope) { .. }]); 
+0

你是什麼意思參數化 –

+0

更新了這個問題更具體。 – hansi

回答

1

在基礎層面上,你可以檢查current route看到正在使用什麼模板和分支關閉這一點。

app.controller('Ctrl', function($route) { 
    if ($route.current.templateUrl === '/foo.html') { 
    doFoo(); 
    } else { 
    doBar(); 
    } 
}); 

這隻有在您爲每條路線使用不同模板時纔有效。如果您想重新使用相同的模板,則resolve property of the route非常有用。

app.config(function($routeProvider) { 
    $routeProvider.when('/foo', { 
    controller: 'Ctrl', 
    templateUrl: '/foo.html' 
    resolve: { 
     whichRoute: function() { return 'foo'; } 
    } 
    }); 
}); 

app.controller('Ctrl', function(whichRoute) { 
    if (whichRoute === 'foo') { 
    doFoo(); 
    } else { 
    doBar(); 
    } 
}); 

而且比這還要好,resolve性能可以接受返回值承諾的功能,讓你可以做數據的預過濾在那裏。

app.config(function($routeProvider) { 
    $routeProvide.when('/foo', { 
    controller: 'Ctrl', 
    templateUrl: '/foo.html', 
    resolve: { 
     dataToDisplay: function(YourDataService) { 
     return YourDataService.getSomeData(); 
     } 
    } 
    }); 
}); 

app.controller('Ctrl', function(dataToDisplay) { 
    doTheThing(dataToDisplay); 
}); 
+0

謝謝!正是我在找的東西。 – hansi

2

想想那樣。 兩條路線都是一樣的,只有一條路由器有一個過濾器,一條沒有。因此在現實中它與附加參數filter='some'原路權利,使您的配置可能是這樣的:

app.config(function ($routeProvider) { 
$routeProvider 
    .when('/foo/:filter?', 
     { 
      controller: 'Ctrl', 
      templateUrl: '/foo.html', 
     }) 
}); 

和控制器你必須$routeParams.filter問號將是一個可選的參數。然後在Ctrl中,您只需查找過濾器參數並使用過濾器進行適當渲染即可。 順便說一句,你的看法可以保持不變,只是過濾你的網格。如果filter參數不存在,它只會返回相同的數據(未過濾)

希望有幫助。

+0

這是正確的做法。另一個答案是角度的hacky。可選的查詢參數是要走的路。 – chairmanmow