2014-11-24 52 views
1

在我的角度的应用程序,我有几个嵌套的NG-重复通过一些预期的JSON对象来分析,例如:如何将实际对象(即对对象的引用)传递给指令?

 { 
     landAnimals: { 
       horse: { 
        sound: "Nay", 
        legs: 4, 
       }, 
       beaver: { 
        sound: "thwack", 
        legs: 2 
       } 
     }, 
     waterAnimals: { 
       dolphin: { 
        sound: "Eee", 
        fins: 3, 
       }, 
       goldfish: { 
        sound: "-", 
        fins: 1 
       } 
     } 

    } 

在一个点上,我想要做的就是通过动物类我指令和另一个动物对象。

例如,如果用户将其他动物拖入我的应用中生成的列表中,我想添加他拖入上述JSON中的动物。

要做到这一点,我试图将动物对象传递给指令,然后添加新的动物。

例如:

<div ng-repeat="animalCategory in animals on-drop-success='animalCategory'"> 
    <div ng-repeat="(key, value) in animalCategory"> 
     {{key}} 
    </div> 
</div> 

,然后在我的onDropSuccess指令,在link功能,我想 (不要担心,我怎么做的拖放,它不工作,甚至这个简单的测试)

... 
link: function (scope, element, attrs) { 
    attrs.onDropSuccess["newAnimal"] = {sound: "miy", legs: 2}; 
... 

总之,我想给animalCategory对象传递给我的指令,这样我可以在它添加更多的对象。但它不起作用。它不会添加对象,即使我手动提供一个天真的对象(即它与拖动实施无关)

任何想法为什么会发生这种情况?

+1

您的指令的链接函数是否被执行?如果不是的话,修复你的模板,真正使用指令作为元素属性(不是'ng-repeat'中的表达的一部分)。 – hon2a 2014-11-24 14:13:41

+0

你能设置一个我们可以玩的小提琴吗? – 2014-11-24 14:14:44

+0

@MattWay这里有一些非常相似的东西。当拖动“Boy”或“Girl”时,我想添加到拖动的人物对象上http://codepen.io/Raphi/pen/dPoYvX – CodyBugstein 2014-11-24 14:19:27

回答

1

此刻,您并未引用实际对象,只会返回字符串的attrs构造上的属性。

有几种方法可以在实际参考中使用。

使用scope.$eval

//Target object will be pulled in if it exists on the scope 
// this will not work if you are using Isolate Scope 
var targetObject = scope.$eval(attrs.onDropSuccess); 

Isolate Scope

可以在参数代入指令拉使用=参数通过使用该指令定义scope财产隔离范围。

{ 
    scope:{ 
    onDropSuccess: '=' 
    } 
    link: function(scope, elem, attrs){ 
    //Basically same as above, except that they 
    // are pulled from the parent scope 
    var targetObject = scope.onDropSuccess; 
    } 
} 
+0

太棒了!完美的作品。你能解释为什么它给了我一个字符串,为什么'$ eval'使它成为一个对象? – CodyBugstein 2014-11-24 14:58:07

+0

@Imray - 'attrs'只是一个构造,它使您可以规范化访问元素的属性。结果是字符串或表达式的插值结果。例如{{1 + 2}}将是'3',但结果仍然是一个字符串。 '$ eval'实际上将对该范围执行该表达式,并返回结果。在这种情况下,它是作用域上属性的名称,因此结果是存储在该属性中的对象/值。 – Josh 2014-11-24 15:25:30

+0

我发现你的答案有问题,那就是'$ eval'断开了它的父对象。意思是,如果我现在对这个对象进行更改,它并不反映在原始的JSON对象中。例如,如果我在通过'$ eval'后对'landAnimals'进行了更改,我没有看到我的控制器 – CodyBugstein 2014-11-24 16:31:24