Angularjs 将对象的键传递给指令

Angularjs 将对象的键传递给指令,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我已经创建了一个指令作为md autocomplete的包装器,以便更容易重用。在父控制器中,我有一个对象。我想将对象的键传递给我的自定义指令,但遇到了问题。简化代码,无md自动完成: 这是剧本 var app = angular.module('myApp',[]) .controller('parentController', function(){ var parent = this; parent.things = {item1: {color: "blue"}, item2:

我已经创建了一个指令作为md autocomplete的包装器,以便更容易重用。在父控制器中,我有一个对象。我想将对象的键传递给我的自定义指令,但遇到了问题。简化代码,无md自动完成:

这是剧本

var app = angular.module('myApp',[])
.controller('parentController', function(){
  var parent = this;
  parent.things = {item1: {color: "blue"}, item2: {color: "red"}};
})
.directive('childDirective',function(){
  return {
    scope: {},
    bindToController: {
       items:'&'
    },
    controller: childController,
    controllerAs: 'child',
    template: '<pre>{{child.items | JSON}}<pre>' //should be [item1,item1]
  }

  function childController(){
    //Just a dummy controller for now
  }
})
HTML


TL;DR:如何将父控制器中定义的对象的键传递给子指令?我只需要传递键,而不需要传递对象本身,因为我的指令设计用于处理字符串数组。

尝试使用具有“用户属性”的本地范围的指令=

$scope.getKeys=function(obj){
  //initialize result
  this.result?this.result.length=0:this.result=[];
  //fill result
  var result=this.result;  
  Object.keys(obj).forEach(function(item){
   result.push(item);
   })
  return result;
}

我认为@Igor的答案是正确的,因为它最终把我带到了正确的地方。然而,我想提供我的最终解决方案,这个方案太大,无法发表评论

为了找到这个问题的答案,我创建了一个更灵活的指令,可以接受多种不同类型的输入

对原始问题的真正关键和我的实际答案是将items参数绑定到指令中的代理getter/setter对象。基本设置是:

HTML

最后,我决定让我的指令能够接受多种格式,并提出了一个演示


请随时就改进我的代码提出意见/建议。谢谢

你是说我必须重新设计指令来处理对象而不是数组?没有合理的方法获取父作用域中对象的键并将其传递给指令?
app.directive('childDirective', function() {
  return {
    replace: true,
    restrict: 'E',
    scope: {
         items: '='
    },
    template: '<pre>{{items | JSON}}<pre>'
  };
});
<div ng-app="myApp" ng-controller="parentController as parent">
    <my-directive items="getKeys(parent.things)">
    </my-directive>
</div>
$scope.getKeys=function(obj){
  //initialize result
  this.result?this.result.length=0:this.result=[];
  //fill result
  var result=this.result;  
  Object.keys(obj).forEach(function(item){
   result.push(item);
   })
  return result;
}
app.directive('myDirective',function(){
  return {
    ...
      controller: localControl,
      bindToController: {
        items: '<' //note one-way binding
      }
    ...
  }
  function localControl(){
    var child = this;
    child._items = [],

    Object.defineProperties(child,{
       items: {
         get: function(){return child._items},
         set: function(x){child._items = Object.keys(x)}
       }
    });
  }
});
<my-directive items="parent.items">
  <!-- where parent.items is {item1:{}, item2:{}...} -->
</my-directive>