2014-11-24 3 views
1

В моем угловом приложении, у меня есть несколько вложенных нг-повторы для разбора через несколько ожидаемых объектов 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

Выполняется ли функция 'link' вашей директивы вообще? Если нет, исправьте свой шаблон, чтобы действительно использовать директиву как атрибут элемента (не являющийся частью выражения в 'ng-repeat'). – hon2a

+0

Можете ли вы настроить скрипку, с которой мы можем играть? –

+0

@MattWay Вот что-то очень похожее. Когда «Мальчик» или «Девушка» перетаскиваются, я хочу добавить к объекту человека его перетаскивание через http://codepen.io/Raphi/pen/dPoYvX – CodyBugstein

ответ

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

+0

@Imray - 'attrs' - это просто конструкция, которая дает вам нормализованный доступ к атрибутам элемента. Результатом является либо строка, либо интерполированный результат выражения. например {{1 + 2}} будет '3', но результат все равно является строкой. '$ eval' фактически выполнит это выражение против области действия и вернет результат. В этом случае это имя свойства в области, поэтому результатом является объект/значение, хранящееся в этом свойстве. – Josh

+0

Я обнаружил проблему с вашим ответом, и это означает, что '$ eval' отключает объект от его родителя. Смысл, если я сейчас вношу изменения в этот объект, он не отражается в исходном объекте JSON. Например, если я внес изменения в «landAnimals» после того, как он был помещен через '$ eval', я не вижу изменения переменной' $ scope.animals' в моем контроллере – CodyBugstein

Смежные вопросы