среда, 10 июля 2013 г.

Доклад Client Side Rendering

Вчера в костромском офисе Софтлайн прочитал доклад о Client Side Rendering.


18 комментариев:

  1. Ни чего себе "thanks".. Да чувак практически целый континент открыл и всем путь показал :-)
    СПАСИБО!

    ОтветитьУдалить
  2. Большое спасибо за пост. А есть ли способ отобразить представление списка на remote web при помощи CSR?

    ОтветитьУдалить
    Ответы
    1. Смотря что ты имеешь в виду под remote web. Другой узел? Узел из другой коллекции сайтов? Узел app'а? Узел из другого веб-приложения?

      Удалить
    2. Меня интересует можно ли показать список SharePoint на узле, который не хостится на ферме SharePoint, чтобы это представление списка выглядело, как на самой SharePoint ферме. (я помню, что термин remote web - это из раздела про создание cloud apps для SP2013). Понятно, что если твой код работает не на ферме SP, то можно через сервисы вытянуть данные и метаданные списка и нарисовать его ручками. Но у меня мелькнула смутная надежда, что может быть CSR поможет отрисовывать представления списков проще и так же, как сам SP делает это. Что думаешь?

      Удалить
    3. В Apps можно отображать списки используя стандартные веб-части, и как следствие - CSR, - без проблем. Узел App Web хостится в пределах фермы.

      Рисовать списки за пределами фермы, к примеру в provider-hosted app на отдельном ASP.Net сайте, с помощью CSR не получится. Проблема в том что для того чтобы запустить CSR, нужны входные данные - контекст. Контексты в CSR, как я рассказывал в докладе, это очень-очень сложная штука. Там сотни, если не тысячи разнообразных свойств, и причем для разных ситуаций контексты разные. Этот контекст формируется обычно стандартными веб-частями, но чтобы сформировать такой контекст "вручную", боюсь потребуется очень много времени... Куда проще отображать список либо полностью кастомно, либо на App Web.

      Удалить
  3. Очень интересно. Вот мне поставили задачу разработать Conrol для представления XMLв очень спечифичній способ: таблица з дополнительными хедерами слева, решил сделать это с помощью MVVM (Knockou.js). Но вот тут проблема, допустим я преобразую XML в JSON и построю правильный DOM, а вот как быть с Edit Form? Можно как-то перед отправкой измененного объекта изменить содеражание его поля, что бы потом в server-side преобразовать обратно в XML?
    Сомо поле будет MultiColumn.

    И еще один вопрос, как получить подписку для этого онлайнового SharePoint, ибо разрабатывать локально не могу - вычислительной мощьности нехватает ...

    ОтветитьУдалить
  4. Спасибо большое. Слайды где-нибудь выложены? Хочу сохранить себе подсказку по Render.

    ОтветитьУдалить
  5. Подскажи, плиз, можно ли через CSR показывать аттачменты текущего элемента (список файлов)? Как я понимаю, объект ctx, который присутствует в методах-обработчиках (function customItem(ctx) {} etc.), это не "настоящий" объект ClientContext, т.е. нельзя внутри customItem(ctx) написать так:
    ctx.load(ctx.CurrentItem, 'Attachments');
    ctx.executeQueryAsync(Function.createDelegate(this, this.onSuccess), Function.createDelegate(this, this.onFailed));
    return "hello " //??? список аттачментов будет попозже (когда загрузится и получит управление метод onSuccess), а вернуть контент элемента нужно прямо сейчас.

    ОтветитьУдалить
    Ответы
    1. Ctx в CSR handler-ах вообще никакого отношения не имеет к ClientContext. В докладе это объяснено. Если ты хочешь показывать список вложений в представлении списка, то нужно внутри обработчика создать какой то элемент с фиксированным id, и обработчикам ни сделать асинхронный запрос через ClientContext.get_current(). В onsuccess делаешь соответственно $get(id).innerHTML= ... Информация появится с небольшой задержкой, но иначе никак

      Удалить
    2. ага, спасибо, так и сделал.
      PS: если кому интересно, то загрузку аттачментов сделал через REST:
      http://msdn.microsoft.com/en-us/library/office/apps/dn292553.aspx#FileAttachments

      Удалить
  6. Отличный доклад!!
    Начал применять эту технику на практике и столкнулся с таким странным поведением...
    У меня есть page, на которой размещено несколько web parts. В основном это веб-части с представлениями (views) различных списков. Все списки созданы по уникальным шаблонам (т.е. SPList.BaseTemplate у всех списков имеет уникальное значение). У всех кроме двух. :-(

    Эти два списка списка созданы с помощью SharePoint Designer и являются внешними списками (External List), которые подключаются к внешней базе данных MS SQL. Оба эти списка имеют свойства SPList.BaseTemplate = 600. По этому csr скрипт одного списка также воздействует и на другой список. В результате представление одного списка отрисовывается корректно, а другой нет.

    Исходя из доклада я понял, что для конкретизации списка и представления (view), к которому будет применен наш js-скрипт можно дополнительно указать BaseViewID и ViewStyle.
    BaseViewID в данном случае не подходит, потому что оба списка имеют BaseViewID = 1.

    Тогда я решил изменить ViewStyle одного из списков. А в CSR скрипте указал, что он должен применяться к списку если его ViewStyle равен 17.
    Т.е. вот так:

    templateOptions.ListTemplateType = 600;
    templateOptions.ViewStyle = 17;

    Скрипт не отработал. Внешний вид обоих списков был сгенерирован SharePoint'ом так, как он это делает стандартным образом. :-(

    Хотел спросить.
    1) Вам приходилось кастомизировать представление со стилем отличным от стиля по умолчанию?
    2) Вам приходилось кастомизировать представления списка, отличное от представление списка по умолчанию т.е. представление списка, для которого BaseViewID не равен 1.

    Возможно это просто мой персональный баг..
    Или SharePoint просто не поддерживает такой возможности. Т.е. если кто-то пытается кастомизировать представление списка, стиль которого отличен от default, то SharePoint просто не "переваривает" такую кастомизацию и не применяет её. А свойство ViewStyle просто забыли убрать :-)))

    Может быть BaseViewID тоже забыли убрать и на самом деле оно ни на что не влияет. Таким образом мы сможем кастомизировать только одно представление списка. Т.е. только представление списка по умолчанию :-(

    ОтветитьУдалить
    Ответы
    1. Привет,

      Сорри за поздний ответ, работы много, забываю отвечать! :(

      Нельзя просто так задать ViewStyle у templateOptions и думать что шарепойнт магическим образом определит что ты решил что цифра 17 означает что ты хочешь этот шаблон накатить например на 1е представление списка... Или на второе?:)

      ViewStyle это "фильтр". Т.е. он заставляет шаблон срабатывать только на те представления, у которых ViewStyle установлен в заданное значение. Естественно сейчас у тебя на обоих представлениях ViewStyle стоит Default, и тебе надо его поменять для хотя бы одного из представлений, и соответственно поменять настройки шаблона предназначенного для этого представления.

      Если через GUI, поменять можно так: идешь в "Modify view" ("Изменить представление") и выбираешь один из стилей которые там есть.
      Если программно, накатить ViewStyle на представление можно методом SPView.ApplyStyle.
      Также можно задать через CAML, элемент ViewStyleID.

      Количество ViewStyle ограничено. Можно использовать только стандартные. Они заданы в файле \15\TEMPLATE\GLOBAL\XML\VWSTYLES.XML

      BaseViewID также вполне реально поменять для вьюшки, обычно он задается через CAML, не уверен, можно ли задать программно. Соответственно правила там те же. BaseViewID может быть любое число. Некоторые числа кое-что означают для шарепойнта, т.е. возможно некастомизированное представление станет выглядеть немного по-другому - в этом случае просто попробуй другое число.

      Всё работает :) Да, я пробовал. Честно.

      Удалить
    2. Спасибо за ответ :-)

      Я безусловно использовал BaseViewID. Просто упустил это в примере.
      Сегодня я создал собственный шаблон спиcка (на основе обычного списка, а не внешнего!) У меня было что-то вроде:
      templateOptions.BaseViewID = 1;
      templateOptions.ListTemplateType = 16606;
      templateOptions.ViewStyle = 17;

      Сначала я менял стиль представления списка через GUI.
      Затем смотрел, каким стало значение свойства SPView.StyleID с помощью SharePoint Manager.
      Наконец выставлял соответствующее значение в JavaScript'е.

      И в итоге, могу с уверенно заявить, что использование ViewStyle в CSR для конкретизации представления списка совершенно бесполезно! Дело в том, что скрипт, заданный в свойстве SPView.JSLink даже не загружается на страницу, если для представления списка задан любой иной стиль, кроме стиля "По умолчанию".

      "Общение" с гуглом выдало ссылки на несколько статей, где люди также раздосадованы, что client side rendering не работает если поменять стиль представления списка со стиля по умолчанию. Кастомный JavaScript файл просто не подгружается.

      Я попробовал разметить на одной странице 2 представления списка с разными ViewStyle. Бесполезно! Представление, для которого ViewStyle отлично от значения по умолчанию, не удаётся кастомизировать с помощью CSR :-(

      Этот "баг" есть в SharePoint on premises. Возможно в облаке как-то иначе. Но я очень сомневаюсь :-(

      Ну и как я писал ранее, есть баг с внешними списками (External List). :-(

      Удалить
  7. Андрей, можно ли получить файл презентации (*.ppt)? Я хочу его доработать (добавить свои примеры CSR+jQuery+REST+CSS, а также более подробно рассмотреть альтернативы CSR по кастомизации UI списка) и прочесть внутри компании. Если презу можно получить, то вышли плиз её на [berlicon at mail.ru]
    Спасибо :-)

    ОтветитьУдалить
  8. Андрей, видео с докладом больше не доступно( Его еще можно где нибудь посмотреть?

    ОтветитьУдалить

Внимание! Реклама и прочий спам будут беспощадно удаляться.