Приложения Zendesk: как создать прослушиватели событий после инициализации приложения?

В настоящее время я работаю над приложением, одним из параметров которого является brand_field_id. Он будет содержать идентификатор пользовательского поля заявки для «Бренд». Дело в том, что он не требуется, поскольку пользователь может захотеть или не использовать предоставляемые им функции. Ожидаемое поведение:

  • Если это поле заполнено идентификатором, прослушиватель событий для его .change будет добавлен в настраиваемое поле (и все будет сделано);
  • Если оставить пустым, ничего не должно произойти. Это означает, что пользователь решил не использовать его.

Zendesk уже предоставляет идеальное средство прослушивания для изменения пользовательского поля заявки. событие, которое работает следующим образом (динамически используя brand_field_id):

events: {
  "ticket.custom_field_ticket.custom_field_{{brand_field_id}}.changed": "myCustomFieldChangedFunction"
}

... и было бы действительно здорово, если бы приложение не аварийно завершало работу, когда brand_field_id пусто.

Поскольку я не хочу, чтобы приложение зависало, если brand_field_id оставить пустым, я решил проверить его перед добавлением прослушивателя событий, но не смог этого сделать. Я пробовал несколько вариантов следующего кода в событии app.created, но все безуспешно.

if(!_.isEmpty(this.setting('brand_field_id'))){
  console.log('Brand change event added');
  this.events['ticket.custom_field_ticket.custom_field_{{brand_field_id}}.changed'] = 'brandChangedHandler';
}

console.log увольняют, так что валидация прошла успешно. К сожалению, событие никогда не срабатывает для настраиваемого поля.

Итак, мой вопрос: как я могу добавить прослушиватель событий на ходу? Или есть другой способ добиться того, что мне нужно?


Я даже сообщил об этом в сообществе Zendesk в аналогичной теме, но пока нет ответов. обходной путь, который я там нашел, на самом деле работает, но мне он не очень нравится:

events: {
  // [...]
  '*.changed': 'anyFieldChangedHandler'
},
// [...]
anyFieldChangedHandler: function(e){
  // If the changed field was {brand_field_id}
  if(!_.isEmpty(this.setting('brand_field_id')) && e.propertyName === 'ticket.custom_field_'+ this.setting('brand_field_id')){
    this.brandChangedHandler(e);
  }
},

Оно слишком широкое и срабатывает при изменении любого поля в заявке. Я хотел бы найти лучшее, чистое и элегантное решение.


person mathielo    schedule 26.05.2015    source источник
comment
Привет, Майкл, не могли бы вы просто связать новый прослушиватель событий с помощью jQuery, как показано ниже — this.$(‘.some-element-in-app’).on(‘click’, function() { /* do some thing. */ }), заменив элемент на нужный вам элемент?   -  person Jimmy Long    schedule 19.07.2015


Ответы (1)


Я нахожусь в той же лодке, поскольку знаю, как сложно найти ответы, связанные с фреймворком Zendesk Apps.

я бы сделал что-то вроде этого

events: {
  "ticket.custom_field_ticket.custom_field_{{brand_field_id}}.changed":"itChanged"
},
itChanged: function(){
      if(ticket.custom_field_ticket.custom_field_{{brand_field_id}} !== null && ticket.custom_field_ticket.custom_field_{{brand_field_id}} !== undefined){
          //Your custom field exists and has a value. Do something with it.
      }
      else{
          //Your custom field does not exist and/or does not have a value. do nothing
      }
}

Будет ли что-то подобное работать для вашего приложения? Я не уверен, что это будет иметь ту же функциональность, что и !_.isEmpty(), но вы можете попробовать. Я часто использую это в своем приложении, иногда просто в качестве надежной защиты, если мое приложение загружается быстрее, чем фактический билет, что приводит к тому, что некоторые значения становятся «неопределенными» во время загрузки приложения.

Надеюсь это поможет

person Damian C    schedule 24.06.2015
comment
Спасибо за ответ, действительно иногда трудно найти то, что нужно. В любом случае, я вижу две проблемы с вашим кодом: 1) Регистрация "ticket.custom_field_ticket.custom_field_{{brand_field_id}}.changed" как события является частью проблемы в моем вопросе: он выдает ошибку JS: Uncaught Error: Syntax error, unrecognized expression: {{brand_field_id}}.changed. 2) В функции itChanged ticket.custom_field_ticket.custom_field_{{brand_field_id}} не оценивается и даже не является допустимым синтаксисом JS. Выражение оценивается как прослушиватель событий, потому что платформа анализирует строку. - person mathielo; 24.06.2015
comment
О проблеме 1) выше, я имею в виду, что выдает ошибку, если поле оставлено пустым (вообще нет значения). - person mathielo; 24.06.2015