Передать объект в пользовательскую директиву без создания наблюдателей?

Я создал пользовательскую директиву ("повторно используемый компонент"), которая создает изолированную область видимости путем привязки к двум объектам, переданным ей через HTML-параметры. Проблема с этим быстро возникает, так как в моем документе содержится до 600 таких компонентов, что приводит к 1200 наблюдателям и низкой производительности. Мне не нужны эти наблюдатели, просто какая-то форма "связать один раз"- функциональность при прохождении объектов. Есть ли способ сделать это (или обходной путь), или мне нужно изменить дизайн моего кода?

(Передача данных в виде одной или нескольких строк вместо объекта является очень нежелательным вариантом.)

2 ответа

Решение

Вам следует использовать одностороннюю привязку:

scope : {
    myField: '&'
    ....
}

и в директиве используя:

<my-directive my-field="::myDataObjectFromScope"></my-directive>

Может быть, это поможет

Но если значения постоянно на всех, вы должны использовать сервис, чтобы отделить ваши данные от бизнес-логики

Вы можете оценить объект вручную, не используя привязки угловых директив. Скажи, у тебя есть директива some-component и вы хотите передать config объект в нем сохраняя изолированную директивную область видимости. Вы могли бы сделать что-то вроде этого:

<some-component config="controller.config"></some-component>

Тогда директива может выглядеть так:

.directive('someComponent', function() {
  return {
    scope: {
      // some bindings, but not config
    },
    link: function(scope, element, attrs) {
      var config = scope.$parent.$eval(attrs.config)
      console.log(config)
    }
  }
})

$parent здесь необходимо, потому что директива scope изолирована, и вы хотите получить объект, определенный во внешней (родительской) области видимости.

Попробуйте и посмотрите, будет ли это иметь значение для вашей установки.

Другие вопросы по тегам