在AngularJS中将对象从指令发送到父控制器

时间:2014-07-07 23:02:51

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-controller

如何将对象从指令发送回父控制器?

我已经定义了以下指令:

app.directive('inspectorSharedObjects', function () {
  return {
    restrict: 'E',
    scope: {
      filterText: '=filter',
      type: '=',
      selectObject: '&onSelect'
    },
    controller: function ($scope) {
      $scope.dot = function (tags) {
        return "label-dot-" + tags[0];
      }
    },
    link: function (scope, element, attrs) {

    },
    templateUrl: 'partials/InspectorSharedObjectListPartial.html'
  };
});

...我用以下方式打电话:

<inspector-shared-objects ng-repeat="group in modelSharedObjects" type="group" filter="filterText" on-select="selectObject(obj)"></inspector-shared-objects>

...使用以下模板:

<div class="object-group-header" ng-click="isActive = !isActive" ng-class="{active : isActive}">
  <span>{{ type.name }}</span>
  <span ng-if="filterText">({{ filteredList.length }})</span>
  <i class="fa fa-plus-circle"></i>
</div>
<div class="object-group-list" ng-show="isActive">
  <ul>
    <li ng-repeat="obj in filteredList = (type.contents | filter:filterText | orderBy:'name')" ng-class="dot(obj.tags)" ng-click="selectObject(obj)">{{ obj.name }}</li>
  </ul>
</div>

列表中ng-click上的li应该将选定的obj发送回父控制器。上面的代码调用了父控制器的功能,但我尝试传递的对象以undefined形式出现。

我仔细阅读了以下问题:calling method of parent controller from a directive in AngularJS - 我认为它试图做同样的事情,但我无法看到我做的不同于答案(或我的解释)它)。

如何将来自指令模板的obj传递回父控制器?

更新:这是一个JSFiddle:http://jsfiddle.net/EvilClosetMonkey/7GMEG/

当您点击项目符号值时,控制台应该吐出对象。

2 个答案:

答案 0 :(得分:2)

在隔离范围属性对象中将绑定类型从单向更改为双向(&=

FIDDLE

使用=时,对象(此处为函数)通过​​引用传递,因此您只需按名称传递它(而不是像以前那样传递函数)。然后你可以调用它,一切都很好。

但是当你使用&时,有什么角度包裹你在eval发送的内容并返回一个包裹它的函数。因此,在li元素的每次重复中调用的函数都是这样的:

function(obj){
   return $eval('selectObject("whatever")) 
}

这就是为什么你会得到&#34;无论什么&#34;记录,无论你传递的是obj


注意:由于您使用嵌套的ngRepeat,因此每个li元素都是控制器范围下的2个子范围。调用$parent.$parent.selectObject(obj)也可以作为结果。你不应该这样做,它并不真正属于你的问题,只是一个友好的提醒,因为在有问题的问题上提出了很多这样的事情。

答案 1 :(得分:0)

您可以传递&#39; group&#39;的值你从ng-repeat那里获得的。

<inspector-shared-objects ng-repeat="group in modelSharedObjects" type="group" filter="filterText" on-select="selectObject(group)"></inspector-shared-objects>