Vue.js v1 не работает должным образом с загруженным html-файлом Ajax

У меня небольшая проблема, связанная с загруженным контентом по запросу ajax.

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

Если я загружаю все в один файл, не разбивая на отдельные файлы, все работает. Но когда я создал файлы контента и начал загружать их через запросы Ajax jQuery, Vue.js перестал правильно работать с {{variable}} или другими событиями.

Я использую Vue.js v1 и jQuery для этого веб-приложения.

Спасибо за ответы.


person Aivaras    schedule 23.11.2017    source источник
comment
вы должны предоставить нам код, который вы используете, мы должны увидеть его, чтобы иметь возможность помочь вам, поделиться им здесь или на сайте jsfiddle   -  person Kresimir Pendic    schedule 23.11.2017
comment
@KresimirPendic Ну, это много кода. Я использую запрос jQuery ($( .layoutCity ).load(../url/forecast.html);) для добавления полученного HTML, и в этом HTML я использую все {{variables}}, и они просто загружаются как HTML . Vue.js не читает его.   -  person Aivaras    schedule 23.11.2017
comment
Vue не предназначен для работы так, как вы пытаетесь его использовать: он должен иметь возможность компилировать шаблоны и добавлять свои привязки данных, вы не можете просто выгружать HTML-код шаблона на страницу с помощью jquery и ожидать, что он будет работать. . (Как правило, вы не должны изменять DOM напрямую при использовании Vue или подобных фреймворков). Почему вы решили разделить контент на несколько файлов?   -  person Daniel Beck    schedule 23.11.2017
comment
@DanielBeck Я могу опубликовать для вас пример того, как извлекать различный контент / данные на одной странице (но с несколькими шаблонами) ... как вы думаете, это вам поможет?   -  person Kresimir Pendic    schedule 23.11.2017
comment
@DanielBeck Я пытаюсь сделать его более легким, и если я использую все в одном файле, он очень медленный - 9 секунд при первой загрузке и 4 секунды при второй загрузке из кэша. Ajax помог бы мне сократить объем HTML, который у меня есть, и упростить работу с ним. Спасибо за ответ, надо будет попробовать как-то по другому уменьшить время загрузки.   -  person Aivaras    schedule 23.11.2017
comment
@KresmirPendic Я не уверен, может быть, это помогло бы, если бы я мог смонтировать HTML в этот шаблон. Если да, то это решит мою проблему.   -  person Aivaras    schedule 23.11.2017
comment
Более распространенная стратегия для этого состоит в том, чтобы сохранить шаблоны (которые, как правило, относительно малы) в виде одной скомпилированной сборки SPA, а затем компоненты Vue загружают (относительно широкополосный) контент в виде данных через AJAX. Конечно, зависит от структуры вашего сайта/приложения.   -  person Daniel Beck    schedule 23.11.2017
comment
@DanielBeck, например, мой шаблон прогноза.html содержит 54 строки HTML, включая элементы v-html, {{variable}} и v-for vue.js. Я не знаю, что я сделал не так, но я пытался использовать все эти функции vue.js в шаблонах страниц маршрутов, но они также загружались как HTML. Может у вас есть пример?   -  person Aivaras    schedule 23.11.2017


Ответы (1)


Альварас,

Я отправляю вам пример с одним html-файлом, который я сначала извлекаю как шаблон, а затем прикрепляю экземпляр vue.

Я использовал axios вместо jQuery, потому что это круто, и я включил кучу комментариев к коду, чтобы помочь вам понять, что происходит.

Внимание: загружайте файлы шаблонов только с полностью доверенных серверов!

// let's start by pulling template file and callback our page logic
axios.get('https://dl.dropboxusercontent.com/s/4fg33iyn7kie88s/template.html')
  .then( function(res){
    // 1.) render our template on the page
    renderTemplate(res.data);
    // 2.) create Vue instance
    newVueInstance();
  })
  .catch( err );

// create template on our page
function renderTemplate(html){
  var el = document.createElement('div'); // create new 'div'
  document.body.append( el ); // append it to body
  el.innerHTML = html; // and set html
}

// attach new Vue fn
function newVueInstance(){
  // build new vue instance
  var list = new Vue({
    el:"#list",
    data: { items: [], type: 'posts', },
    methods: {
      // let's pull data from remote host (JSON format)
      pullData: function(verb) {
        var url = "https://jsonplaceholder.typicode.com/" + verb;
        axios.get( url )
          .then( function(res){
            list.items = res.data;
            list.type = verb;
          })
        .catch( err );
      },
    },
  });
}

// handle err
function err(er){ console.log( er );}
ul,
li {
  list-style: none;
  padding: 5px;
}

li .title,
a {
  font-weight: 900;
  cursor: pointer;
}
<script src="https://unpkg.com/[email protected]/dist/axios.min.js"></script>
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>

person Kresimir Pendic    schedule 23.11.2017
comment
Спасибо, но этот метод работает только с данными, мне также нужно получить HTML. Я использую axios, чтобы получить данные json для отображения информации. - person Aivaras; 23.11.2017
comment
Я могу легко заменить jquery на axios, и мы также можем получить шаблон html, я обновлю его позже - person Kresimir Pendic; 23.11.2017