使用相同的Controller AngularJS切换数据

时间:2016-04-27 17:33:38

标签: angularjs

我想知道如何更改数据,但在我的角度应用程序中保留相同的控制器。基本上,当我点击其中一个活动时,我会有一个活动列表(餐馆,公园等......),视图将显示所有餐厅,同样的事情是公园。我知道怎么做,但我需要创建一个park_ctrl和一个restaurant_ctrl,因为数据的格式将完全相同。我只想知道我是否只能使用一个控制器,只需更改单击这些按钮时收到的数据。

我希望我的问题有道理。

4 个答案:

答案 0 :(得分:0)

检索数据的逻辑应该是服务的责任,所以我猜你只是在同一个控制器的不同情况下调用不同的服务

答案 1 :(得分:0)

我认为这不是一个好主意,而是基于意见。

你可以创造一个功能:

function($scope){

  $scope.changePage = function (type) {
    if(type==="park"){
      $scope.parks = asynLoadFunctionToGetParks();
    }else{
      if(type === "restaurants"){
        /* same as below */
      }
    }
  };

}

使用以下内容更改视图中的类型:

<button ng-click="changePage('parks')">Parks</button>
<button ng-click="changePage('restaurants')">Restaurants</button>

<div ng-if="type==='park'">
  {{parks}}
</div>


<div ng-if="type==='restaurants'">
  {{restaurants}}
</div>

答案 2 :(得分:0)

我认为这里的问题是大多数可用的Angular例子都是&#34; hello world&#34;因此它们显示直接从Controller检索数据。问题是开箱即用的AngularJS本身并没有真正的业务逻辑层,我认为大多数添加了这样一层的人都太忙了,无法提供示例。

我这样做的方法是创建一个&#34; master&#34;可以在运行块中预先获取所有不同数据类型的服务,也可以在用户导航应用程序时根据您的需要懒洋洋地获取。然后,我在路由解析(resolve属性)中提供对适用子集合的引用,或者在指令的情况下提供隔离范围。

或者,控制器可以通过调用masterService.getCollection($scope.collectionName)或类似的东西来询问数据,但如果这样做,则会遇到masterService可能还没有该特定集合的问题,然后你必须使用所有承诺解决方案来控制你的控制器,就像控制器负责处理它一样。

您可以通过绑定到View中的masterService.collections[$scope.collectionName]来避免这种情况,这会使Controller仅暴露$ scope或者controllerAs变量上的集合,而masterService仍负责检索数据并使其可用。 / p>

答案 3 :(得分:0)

是的,你可以。只需在范围中使用不同的服务和公共变量。

if (something) {
    $scope.data = restaurantsService.get();
} else {
    $scope.data = parksService.get();
}