mardi 21 juin 2016

Deal with the result of postJSON

I'm trying to implement something with jQuery and Vue.js:

enter image description here

And here is my script part:

<script>
function initVM(result) {
    // alert(result.num)
    var vm2 = new Vue({
        el: '#vm2',
        data: {
            // ③bind one item of the result as example
            rrr: result.num
        }
    });
    $('#vm2').show();
}


$(function() {
var vm = new Vue({
    el: '#vm',
    data: {
        content: ''
    },

    methods: {
        submit: function(event) {
            event.preventDefault();
            var
                $form = $('#vm'),
                content = this.content.trim();

            // ①post textarea content to backend
            $form.postJSON('/api/parse', {
                content: content
            }, function(err, result) {
                if (err) {
                    $form.showFormError(err);

                }
                else {
                    // ②receive a result dictionary
                    $('#vm').hide();
                    initVM(result);
                }
            });
        }
    }
});
});

</script>

Here is my html part:

<html>
<form id="vm", v-on="submit: submit">
    <textarea v-model="content" name="content"></textarea>
    <button type="submit">Have a try!</button>
</form>
<div id="vm2" style"diplay:none;">
    <!-- ④show the result-->
    The result:
    {{ rrr }}
</div>
</html>

Here is the definition of postJSON

<script>
// ...
    postJSON: function (url, data, callback) {
        if (arguments.length===2) {
            callback = data;
            data = {};
        }
        return this.each(function () {
            var $form = $(this);
            $form.showFormError();
            $form.showFormLoading(true);
            _httpJSON('POST', url, data, function (err, r) {
                if (err) {
                    $form.showFormError(err);
                    $form.showFormLoading(false);
                }
                callback && callback(err, r);
            });
        });
// ...
// _httpJSON
function _httpJSON(method, url, data, callback) {
var opt = {
    type: method,
    dataType: 'json'
};
if (method==='GET') {
    opt.url = url + '?' + data;
}
if (method==='POST') {
    opt.url = url;
    opt.data = JSON.stringify(data || {});
    opt.contentType = 'application/json';
}
$.ajax(opt).done(function (r) {
    if (r && r.error) {
        return callback(r);
    }
    return callback(null, r);
}).fail(function (jqXHR, textStatus) {
    return callback({'error': 'http_bad_response', 'data': '' + jqXHR.status, 'message': 'something wrong! (HTTP ' + jqXHR.status + ')'});
});
}
</script>

The process can be described as:

  1. Post the content to backend
  2. Receive the result and hide the form
  3. Create a new Vue with the result
  4. Show the result in a div which is binding with the new Vue instance

Actually, I do receive the result successfully, which is proved by the alert(result.num) statement, but nothing find in vm2's div except The result:

Where is the problem? Or please be free to teach me a simpler approach if there is, because I don't think what I am using is a good one.

Aucun commentaire:

Enregistrer un commentaire