循环中页面对象的范围丢失

时间:2015-07-04 07:10:35

标签: javascript jquery json ckeditor

要存储我的网页内容,我会根据语言的数量使用多个textareas。这些textareas的id /名称是content_nl,content_fr,content_en,...取决于我们使用的语言数量(表格是动态生成的)。我在每个textarea上使用ckeditor。

要存储值,我将vue.js与json一起使用。这些值存储在页面对象中。

this.$http.put('/api/pages/' + this.pageId, this.page, function (response) {}

this.page中的内容值是textarea的值,而不是编辑器的值。所以我需要使用getData()函数,然后替换this.page对象中每种语言的内容值(我不知道这是否是一个可靠的解决方案)。

所以在我使用它之前:

if(CKEDITOR.instances.content_nl)
    this.page.translations['nl'].content = CKEDITOR.instances.content_nl.getData();

if(CKEDITOR.instances.content_en)
    this.page.translations['en'].content = CKEDITOR.instances.content_en.getData();

...(每种语言都相同)

但我希望它可以使用任何语言更加可重用,所以我使用一个函数来生成一个包含页面上所有语言的数组:

function getEditorLanguages()
{
    var collection = [];
    $('textarea.editor').each(function(){
        var data = this.id;
        var arr = data.split('_');
        collection.push(arr[1]);
    });

    return collection;
}

然后我尝试用getData()值替换this.page。[language] .content:

var collection = getEditorLanguages();
var self = this;
$.each(collection, function(index, value) {
    var field = 'content_nl' + value;
    if(CKEDITOR.instances.field)
        self.page.translations[value].content = CKEDITOR.instances.field.getData();
})

进入循环时,我在this.page对象上丢失了范围:

TypeError: this.page is undefined

如何在循环中使用该页面对象?

1 个答案:

答案 0 :(得分:1)

this是与当前上下文相关的特定关键字。在你的循环中,当前上下文是collection元素,而不是你想要的。

在使用之前,您必须将正确的this对象存储到变量中。

var collection = getEditorLanguages();
var self = this;
$.each(collection, function(index, value) {
    if(CKEDITOR.instances.content_+value)
        self.page.translations[value].content = CKEDITOR.instances.content_+value.getData();
})