Шаг за шагом Как включить selectize.JS в проект rails, собрать запрос Ajax и ответ Json? - PullRequest
2 голосов
/ 04 июня 2019

и я слышал про выбор вызова libЗвучит неплохо, чтобы помочь мне показать какой-то потрясающий эффект выпадающего меню.Однако документация не очень проста, и я не знаю, как правильно реализовать выборку.Я пытался использовать его, и это нормально, пока не использовать или реализовать Ajax.Любая помощь ?

по некоторым причинам, когда я вызываю selectize для определенного select класса, это работает.Но когда мне нужно сказать, чтобы выбрать компонент, чтобы сделать запрос AJAX и искать в файле JSON, чтобы получить ответ и построить выпадающий мульти выбор, у меня есть серьезные проблемы.

документация предлагает этот шаблон с примером github:

$('#select-repo').selectize({
      valueField: 'url',
      labelField: 'name',
      searchField: 'name',
      create: false,
      render: {
        option: function(item, escape) {
          return '<div>' +
          '<span class="title">' +
          '<span class="name"><i class="icon ' + (item.fork ? 'fork' : 'source')
          + '"></i>' + escape(item.name) + '</span>' +
          '<span class="by">' + escape(item.username) + '</span>' +
          '</span>' +
          '<span class="description">' + escape(item.description) + '</span>' +
          '<ul class="meta">' +
          (item.language ? '<li class="language">' + escape(item.language) + 
          '</li>' : '') +
          '<li class="watchers"><span>' + escape(item.watchers) + '</span> 
          watchers</li>' +
          '<li class="forks"><span>' + escape(item.forks) + '</span> forks</li>'
          + '</ul>' +
          '</div>';
          }
        },
        score: function(search) {
          var score = this.getScoreFunction(search);
          return function(item) {
             return score(item) * (1 + Math.min(item.watchers / 100, 1));
          };
        },
        load: function(query, callback) {
          if (!query.length) return callback();
            $.ajax({
               url: 'https://api.github.com/legacy/repos/search/' + 
               encodeURIComponent(query),
               type: 'GET',
               error: function() {
               callback();
            },
            success: function(res) {
              callback(res.repositories.slice(0, 10));
            }
        });
     }
 });


Я пытался без какого-либо успеха, потому что я действительно не знаю, как построить файл JSON, запрос такжеочень сложный момент.

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

1 Ответ

0 голосов
/ 04 июня 2019

Добро пожаловать в стек, так.Вы упомянули несколько шагов без добавления большого количества описаний.Но вот в чем дело с тем, какой Lib вы используете, вам нужно прочитать и снова прочитать его документацию.

Rails и JavaScript Lib работают вместе через веб-пакет.Какая бы библиотека вам ни была нужна.Вы найдете нужную библиотеку Пряжа .

От библиотеки selectize.js до представления вам нужно будет по крайней мере воспроизвести некоторые файлы file.js, file.rb, file.json, rout.rb, так что это огромный вопрос ....

Давайте начнем с этой настройки, и если понадобится дополнительная информация, я потрачу больше времени

Ваше текущее приложение rails добавляет веб-пакет или нет?

Как RoR, у нас есть способы вызвать некоторый JavaScriptlibs и пишите свой собственный скрипт.

Старый метод состоит в том, чтобы поиграть с этим файлом app/assets/javascripts

Современный метод - это работа с веб-пакетом.И делать вещи внутри этого файла, например app/javascript/packs/application.js

Я полагаю, что веб-пакет установлен, потому что вы пометили это слово.Имейте в виду, что можно обрабатывать по старому методу, но оставайтесь обновленными

пряжа

По приведенной выше ссылке пряжа

установите selectize.js в вашем приложении с этой командной строкой

$ yarn add selectize

, который добавит последнюю версию selectize в ваш файл package.json

Вызовите selectize в правильном направлении

 $ mkdir app/javascript/components  ## to create a folder to file your JS components 
 $ touch  app/javascript/components/selectize.js ## to create a file to build JS components

Перейдите в папку node_modules, в которой размещены все библиотеки javascript, установленные вами или нет.Эта папка находится в корне вашего приложения.

(1) Затем выясните файл node_modules/selectize/dist

Затем откройте файл app/javascript/components/selectize.js в текстовом редакторе и давайте напишем основной код...

# app/javascript/components/selectize.js
import 'selectize/dist/js/selectize.min.js'; # scroll to node folder (1) get that path
import 'selectize/dist/css/selectize.css'; # scroll to node folder (1) get that path

const selectize = () => {
  $('.select-beast').selectize({
      // create: true, (from example on selectize page)
      sortField: 'text'
  });

};

export { selectize }; # app/javascript/packs/application.js will call that const

Затем откройте файл inside app/javascript/packs/application.js в текстовом редакторе, и давайте напишем основной код ...

Вызовите компонент выбора в правильном направлении

# inside app/javascript/packs/application.js
import { selectize } from '../components/selectize'; # import the component
// selectize(); # init the component ⚠️ comment that line for now

Показать форму с правильным выбором класса выбора ('.select-beast')

что-то вроде тис в рубине ...

<%= form_for @category do |f| %>
   <%= f.text_field :name %>
   <%= f.select(:single_option_ids,
         SingleOption.all.collect {|a| [a.name, a.id]}, 
         {:include_blank => "category select"}, 
         {:class => "select-beast"})-%>
<%end %>

Ваш вывод ...

<!-- where you want in your app   -->
<select class="select-beast" name="category[single_option_ids]" id="category_single_option_ids"><option value="">category select</option>
   <option value="1">category A</option>
   <option value="2">category B</option>
   ...
   <option value="37">category X</option>
   <option value="38">category Y</option>
   <option value="39">category Z</option>
</select>

Инициализация в правильном направлении

# inside app/javascript/packs/application.js
import { selectize } from '../components/selectize'; # import the component
selectize(); # init the component 

сделано ✅

Обновите страницу, и все в порядке.

если проблема не устранена ...

в стиле css

(css от selectize не работает? Не загружен? Не извлечен? ..) перейти к config/webpacker.yml

# line 51
development:
  <<: *default
  compile: true
  extract_css: true

Также проверьте и убедитесь, что CSS из веб-пакета загружен ... как это узнать?загляните в консоль вашего webpack-dev-server

Version: webpack 4.32.2
Time: 2351ms
Built at: 06/05/2019 9:21:14 AM
                       Asset        Size             Chunks             Chunk Names
css/application-ff5bcd2e.css    7.73 KiB        application  [emitted]  application 
# ??this line is a css asset from webpack so css from webpack is loaded 
                ...# other lines
ℹ 「wdm」: Compiled successfully.

'$ не определено' или ошибка в консоли javascript

Убедитесь, что в настройках вашего веб-пакета есть эта строка ...

# inside config/webpack/environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')

// Preventing Babel from transpiling NodeModules packages
environment.loaders.delete('nodeModules');

// Bootstrap 4 has a dependency over jQuery & Popper.js:
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    Popper: ['popper.js', 'default']
  })
)

module.exports = environment
# config/webpack/development.js

process.env.NODE_ENV = process.env.NODE_ENV || 'development'

const environment = require('./environment')

module.exports = environment.toWebpackConfig()
# config/webpack/production.js

process.env.NODE_ENV = process.env.NODE_ENV || 'production'

const environment = require('./environment')

module.exports = environment.toWebpackConfig()

финиш

Нет лучшего способа, по моему мнению, начать с webpack и рельсов.Тогда, конечно, API, JSON, поиск - это хорошая вещь, чтобы пройти через js libs, как selectize, choice или даже select2 в конце.Дайте нам знать, если это хорошее начало, чтобы ответить на ваш вопрос «STEP BY STEP ...»

...