Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AJAX部分加载后的Vue绑定?_Javascript_Ajax_Laravel 5.1_Vue.js - Fatal编程技术网

Javascript AJAX部分加载后的Vue绑定?

Javascript AJAX部分加载后的Vue绑定?,javascript,ajax,laravel-5.1,vue.js,Javascript,Ajax,Laravel 5.1,Vue.js,我刚刚开始使用Vue.js,并试图将其整合到我已经开发了一段时间的应用程序中。我的应用程序是使用Laravel、相当数量的jQuery等构建的 我的应用程序中的所有导航元素都使用AJAX(而不是Vue)返回部分视图。因此,任何内部链接或表单提交都是通过AJAX提交到一个Laravel路由,该路由返回部分链接 我已经设置了第一个Vue实例,但它仅在访问者第一次访问使用Vue实例的页面时绑定到元素。Vue实例仍然存在,但当用户离开页面时,它会松开与元素的绑定,然后再回来——可能是因为当用户离开页面时

我刚刚开始使用Vue.js,并试图将其整合到我已经开发了一段时间的应用程序中。我的应用程序是使用Laravel、相当数量的jQuery等构建的

我的应用程序中的所有导航元素都使用AJAX(而不是Vue)返回部分视图。因此,任何内部链接或表单提交都是通过AJAX提交到一个Laravel路由,该路由返回部分链接

我已经设置了第一个Vue实例,但它仅在访问者第一次访问使用Vue实例的页面时绑定到元素。Vue实例仍然存在,但当用户离开页面时,它会松开与元素的绑定,然后再回来——可能是因为当用户离开页面时,元素已从DOM中删除

如何让Vue在返回DOM时绑定回元素(通过Vue不执行的AJAX加载)

My main.js(被Elixir/Browserify消费):

Status.js

var Vue = require('vue');
Vue.use(require('vue-resource'));

module.exports = new Vue({
    el: '#app',

    data: {
        message: ''
    },

    ready: function() {
        this.message = 'loading ...';
    },

    methods: {
        setMessage: function(message) {
            this.message = message;
        },

        getStatus: function(url, data) {
            this.message = 'loading ...';
            this.$http.get(url, data)
                .success(function(result) {
                    console.log('Status get success');
                    this.setMessage(result);
                })
                .error(function() {
                    console.log('Status get error');
                    this.setMessage('Error');
                });
        }
    }
});
正在使用的代码是通过AJAX返回的部分/模板

@extends('layouts.partials.content')


@section('content')
    <div id="app">
        <pre>@{{ $data | json }}</pre>
    </div>
@stop

@section('javascript')
<script type="text/javascript" class="document-script">
$(function()
{
    var href ...
    var data {...}

    MaintenanceStatus.getStatus(href, data);
});
</script>
@stop
@extends('layouts.partials.content'))
@节(“内容”)
@{{$data | json}
@停止
@节(“javascript”)
$(函数()
{
var href。。。
变量数据{…}
MaintenanceStatus.getStatus(href,data);
});
@停止
请注意,它可以在整页刷新时工作,但如果我导航到另一页(这也是一个AJAX调用),然后我返回到此视图,我只看到{{$data | json}}。。。Vue似乎已失去与app元素的绑定。我怎么把它拿回来

我尝试将Vue实例绑定到一个从未离开DOM的元素,然后创建了一个组件,但得到了相同的结果。。。该组件在整页刷新时呈现,但在通过AJAX加载部分内容时不呈现


我还尝试过摆弄.mount,但没有效果。

下面是一个示例,说明了一种可以实现您想要的功能的方法,但我相信Vue的创建者不推荐这种方法:

父vue实例声明:

var newContent = $(response.new_content_html).wrap('<div></div>');

$('#some-container-for-the-dynamic-content').html(newContent);
var newContentInstance = window.vm.$addChild({ 
     el: '#some-container-for-the-dynamic-content', 
     data: function data() {
          return { emptyRecordData: {} };
     } 
});
newContentInstance.$mount();
newContentInstance.$data.someOtherData = response.some_other_data;
这一部分可能在ajax调用的成功函数中:

module.exports = function() { return new Vue({...}) }
var newContent=$(response.new\u content\u html).wrap(“”);
$(“#动态内容的一些容器”).html(newContent);
var newContentInstance=window.vm.$addChild({
el:“#动态内容的一些容器”,
数据:函数数据(){
返回{emptyRecordData:{};
} 
});
newContentInstance.$mount();
newContentInstance.$data.someOtherData=response.some\u other\u数据;

我可以通过更改我的Status.js以返回一个闭包来实现这一点:

var MaintenanceStatus = window.MaintenanceStatus();

...

MaintenanceStatus.getStatus(href, data);
在通过ajax返回的部分脚本中,我能够创建一个新实例:

component = {
  activate: function (done) {
    var self = this
    loadDataAsync(function (data) {
      self.someData = data
      done()
    })
}

我建议您查看一下
激活
挂钩

从文档:


数据准备好后,基本上调用
done()
。然后将插入组件

在ajax调用后尝试重新编译vue实例,当部分加载完成时,请参见我的回答:
var MaintenanceStatus = window.MaintenanceStatus();

...

MaintenanceStatus.getStatus(href, data);
component = {
  activate: function (done) {
    var self = this
    loadDataAsync(function (data) {
      self.someData = data
      done()
    })
}