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