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

Javascript 将对象从指令发送到AngularJS中的父控制器,javascript,angularjs,angularjs-directive,angularjs-scope,angularjs-controller,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Controller,如何将对象从指令发送回父控制器 我定义了以下指令: app.directive('inspectorSharedObjects', function () { return { restrict: 'E', scope: { filterText: '=filter', type: '=', selectObject: '&onSelect' }, controller: function ($scope) {

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

我定义了以下指令:

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>

{{type.name}}
({{filteredList.length}})
  • {{obj.name}
列表中
li
上的
ng点击
,应将所选
obj
发送回父控制器。上面的代码调用父控制器的函数,但是我试图传递的对象是
未定义的

我通读了以下问题:-我认为这是在尝试做同样的事情,但我看不出我所做的与答案(或我对答案的解释)不同

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

更新:下面是一个JSFIDLE:


当您单击带项目符号的值时,控制台应弹出对象。

您可以传递从ng repeat中获得的“group”值

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

将绑定类型从单向更改为双向(隔离作用域属性对象中的
&
更改为
=

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

但是当您使用
&
时,angular所做的是将发送的内容包装在
eval
中,并返回一个包装该内容的函数。因此,您在每次重复
li
元素时调用的函数应该是这样的:

function(obj){
   return $eval('selectObject("whatever")) 
}
这就是为什么你会得到“无论什么”的记录,不管你传递什么作为
obj



注意:由于使用嵌套的
ngRepeat
,因此每个
li
元素都是控制器作用域下的两个子作用域。因此,调用
$parent.$parent.selectObject(obj)
也会起作用。你不应该这样做,这与你的问题并不相关,只是一个友好的提醒,因为这类问题经常被问到。

@Mosho,fiddle补充道。这会返回“类别1”、“类别2”等。。。不是用户单击的特定元素。非常感谢您提供的解决方案和额外信息,它绝对帮助我了解了我对
&
vs
=
的理解+2,如果我有多余的!:)