在具有不同div的同一控制器之间传递值

时间:2014-07-07 05:12:44

标签: angularjs

我不知道如何解释我的问题, 好的,让我试试,

如何从具有相同div名称的其他controller传递值?

<div ng-controller="myCtrl">
    <select ng-model="filterBy" ng-options="filtration.title for filtration in filter_preferences"></select>
</div>
---------------------------------------------------
<div ng-controller="myCtrl">
    <select ng-model="filterBy" ng-options="filtration.title for filtration in filter_preferences"></select>
    <ul>
      <li ng-repeat="vals in datas | filter: vals.completed = filterBy.value">{{vals.title}}</li>
    </ul>
</div>

从第二个div开始,当我过滤我工作正常,但相同的过滤器我在顶部使用相同的controller,但它不起作用。

DEMO PLUNKER

3 个答案:

答案 0 :(得分:2)

问题在于每个ng-controller下都会创建一个新的$ scope。这意味着它们根本不共享$scope,并且还有两个不同的控制器实例。

因此,要在两个控制器之间进行通信,通常的做法是使用服务。

I've updated your plunk with a very basic example.

这个想法是你创建一个像:

这样的服务
app.value('sharedData', { filteredBy: true});

然后将其注入您的控制器并将其放在您的示波器上,如下所示:

app.controller('MyCtrl', function($scope, sharedData) {
  $scope.sharedData = sharedData;
});

之后,您将其用作ng-model值和过滤器:

<select ng-model="sharedData.filteredBy" ng-options="x.value as x.title for x in filter_preferences"></select>
<ul>
  <li ng-repeat="vals in datas | filter: { completed: sharedData.filteredBy }">{{vals.title}}</li>
</ul>

从那里它将起作用,因为两个控制器(和$ scopes)现在都有一个相同对象的实例......你的sharedData服务。

答案 1 :(得分:1)

您需要指定     NG-控制器=&#34; myCtrl&#34; ng-app所在的位置,并删除所有其他ng-controller语句。这是因为无论何时尝试在单个div中执行ng-controller,它都会为该特定div创建一个本地范围,然后下拉列表中的任何更改都会刷新本地范围。

代码:

<body ng-app="myApp" ng-controller="myCtrl">
  <div >
    <select ng-model="$parent.filterBy" ng-options="filtration.title for filtration in filter_preferences"></select>
  </div>
---------------------------------------------------
  <div>
    <select ng-model="$parent.filterBy" ng-options="filtration.title for filtration in filter_preferences"></select>
    <ul>
      <li ng-repeat="vals in datas | filter: vals.completed = $parent.filterBy.value">{{vals.title}}</li>
    </ul>
  </div>
</body>

控制器代码更改donw:

 $rootScope.filterBy = $scope.filter_preferences[1];

之前是:

 $scope.filterBy = $scope.filter_preferences[1];

<强>更新

您可以在rootScope上使用filterBy变量而不是本地范围。因此,本地范围的任何更改都将在根级别完成,更改将反映在任何地方

在你的plunker中尝试了这个并且它正在工作。

答案 2 :(得分:-1)

你不能在ng-app

下两次提到控制器