2014-03-20 2 views
1

У меня возникли проблемы с использованием jQuery dotdotdot plugin в моем приложении Ember.js. Мне нужно запустить плагин на элементе всякий раз, когда его содержимое изменяется, чтобы он мог пересчитать новый контент с помощью многоточия. Проблема в том, что Ember.js не предупреждает меня, когда отображается часть вида, только основного элемента. Поэтому, если модель меняет и обновляет мою ячейку, чтобы иметь значительно больше текста, у меня нет возможности запускать плагин для его очистки.Событие триггера, когда часть шаблона повторно отображается

Есть ли способ быть предупрежденным, когда выражение в шаблоне повторно отображается? Я мог посмотреть значение свойства на модели, но у меня есть десятки коробок на экране из десятков разных моделей, поэтому я думаю, что это будет довольно неэффективно (и медленная моя страница будет уменьшаться по мере того, как она станет больше). Мое текущее мышление будет ругать помощник Рулей:

Ember.Handlebars.helper('dotdotdot', function(str) { 
    var id = generateRandomId(); 
    var content = `<span id="${id}">${str}<span>`; 

    Em.run.later(() => $(`#${id}`).dotdotdot()); 
    return new Handlebars.SafeString(content); 
}); 

Это похоже на неправильном использовании руля помощника, хотя.

+0

Вы можете просто использовать 'CSS' для этого ... У вас меньше головной боли. Проверьте это: http://css-tricks.com/snippets/css/truncate-string-with-ellipsis/ Это отлично работает, если вы просто хотите содержать текст внутри 'DIV' или что-то еще. –

+0

Функциональность «text-overflow» работает только с одной строкой текста, и у меня есть несколько строк, поэтому решение только для CSS не будет работать для меня. (Я знаю, что для этого есть некоторые обходные пути, но никто не особенно хорош.) – GJK

+0

А, хорошо, я должен был более внимательно рассмотреть ваши требования. Взгляните на эту статью, если вы ее не видели: http://css-tricks.com/line-clampin/ Есть несколько, казалось бы, хороших решений CSS для многострочных, а затем и некоторых JS-решений внизу. Не уверен, что вы видели clamp.js? –

ответ

1

Я бы сказал, что путь Ember должен был бы создать представление или (лучше) компонент для этого. Тогда вы могли бы придерживаться наблюдателя там, который следит за содержанием и повторно запускает ваш javascript, когда он изменится.

EDIT: Подумайте об этом, компонент Handlebars не является плохим вариантом, потому что это форматирование, и нет никакой дополнительной логики. Тем не менее, мне кажется, «правильный» способ использования помощника будет делать что-то вроде этого:

Ember.Handlebars.helper('dotdotdot', function(str) { 
    return new Handlebars.SafeString(dotdotdot(str)); 
}); 

Может быть, вы можете найти dotdotdot функцию из плагина?

+0

Меня немного беспокоит производительность, поэтому я не знаю, будет ли работать десятки (или сотни) компонентов. Я определенно могу попробовать. Вы знаете, поддерживает ли Ember.js вложенные компоненты? Я где-то читал, что он не справляется с ними слишком изящно. – GJK

+0

Десятки компонентов не должны быть проблемой, почему бы вам просто не попробовать? Хотя, учитывая, что это форматирование, я не думаю, что помощник руля не является необоснованным. – chopper

+0

Мне нравится идея извлечения функции 'dotdotdot'. К сожалению, это потребует много встроенного CSS, но оно должно работать нормально. Сначала я попробую попробовать. – GJK

0

Ваш вопрос немного двусмыслен, но вот моя интерпретация. Дайте мне знать, если это верно:

  • Вы визуализировали свое мнение.
  • У вас есть текст, который мы назовем someText, внутри элемента.
  • Вы используете .dotdotdot() на элементе, содержащем someText.
  • Пользовательский ввод вызывает изменение значения someText.
  • Вы хотите, но с трудом, бегите .dotdotdot() на элемент, содержащий someText второй раз.

Это правильно?

Если да, вы можете просто наблюдать за свойством someText и запускать .dotdotdot() каждый раз, когда он изменяется. Что-то вроде:

updateDot : function(){ 
    ("#containingElement").dotdotdot(); 
}.observes('someText') 

Внутри ответственного контроллера.

+0

Извините, мне придется вернуться и сделать это более понятным. Этот метод может работать, но он будет довольно хрупким. У меня на экране есть несколько дюжин (возможно, сотни) ящиков, каждая из которых имеет свою собственную модель. И каждая ячейка содержит от 4 до 5 полей от каждой модели. То, как у меня установлены мои компоненты, сделало бы это довольно громоздким, поэтому для меня это последнее средство. – GJK

+0

Сотни моделей? Действительно ли это модели, связанные с представлением/контроллерами, или просто у вас есть массив значений? – gravityplanx

+0

Они полномасштабные модели с отношениями и всеми. Я показываю матрицу данных (вроде электронной таблицы), и каждая ячейка имеет свою собственную модель. – GJK

2

Мы решили это в приложении, создав компонент, у которого не было шаблона. Проблема, с которой мы столкнулись, заключается в том, что dotdotdot немного переусердствовал в отношении DOM-манипуляции IMHO. Он постоянно ступает на носок Метаморфа.Во всяком случае, вот мое решение:

App.DotDotDotComponent = Ember.Component.extend({ 
    tagName: 'span', 

    // Maximum height before the ellipse kicks in. 
    height: 40, 

    didInsertElement: function() { 
     this._super(); 
     this.updateDOM(); 
    }, 

    // {Observer} Watches for content changes 
    _contentDidChange: function() { 
    this.updateDOM(); 
    }.observes('value'), 

    // Updates the DOM with the current values 
    updateDOM: function() { 
    var height = parseInt(this.get('height'), 10) || 40; 
    if(this.get('state') === 'inDOM') { 
     this.$().text(this.get('value')); 
     this.$().dotdotdot({ height: height }); 
    } 
    } 
}); 

В шаблоне:

{{dot-dot-dot value=body height="40"}} 

Вот jsbin: http://emberjs.jsbin.com/wiqisate/2/edit

Надеется, что это помогает.

+0

Я вроде как этот подход. Я думаю, что скоро уйду от dotdotdot, но я, вероятно, буду использовать что-то вроде этого в сочетании с некоторой пользовательской логикой для добавления многоточия. – GJK

+0

Прохладный! Да, dotdotdot немного волосатый. Мне лично все равно, что JS принимает решения о макетах. Но иногда это необходимо. Ура! –

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