2

新しく作成されたオブジェクトを JavaScript 配列にプッシュすると、最後にプッシュされたオブジェクトが古いオブジェクト内の一部を上書きするかのように、配列の一部の要素が最後の要素と同じになります。以下に示すように。

var urlRoot = "http://.../";
var allBooks = []; 
var i = 1;
var max = 2; //3;

getPage(i);

function getPage(bookNo) {

    if (i > max) {
        return;
    }

    $.ajax({
        url: urlRoot + bookNo,
        type: 'GET',
        cache: false,
        success: function(res) {
            var html = res.responseText;

            allBooks.push(new Book(html));
            //allBooks[i - 1] = new Book(html);

            console.log(allBooks);

            i++;
            getPage(i);
        }
    });
}

console.log(allBooks) は、2 つの要素のみがプッシュされ、3 つの要素がプッシュされた場合に以下の結果を示します (ラベル 'EnglishbookHeading' の値は変化しますが、配列 'Pages' の内容は最後にプッシュされたものとすべて同じです)。

[Book, Book]
0: Book    
EnglishbookHeading: "Revelation"
Hadiths: Array[43]
__proto__: Book
1: Book    
EnglishbookHeading: "Belief"
Hadiths: Array[43]
__proto__: Book
length: 2

    Array[3]
0: Book
EnglishbookHeading: "Revelation"
Pages: Array[53]
__proto__: Book
1: Book
EnglishbookHeading: "Belief"
Pages: Array[53]
__proto__: Book
2: Book
EnglishbookHeading: "Knowledge"
Pages: Array[53]
__proto__: Book
length: 3

Book.js :

define(["Page"],
    function (Page) {

        var englishbookHeading;
        var thisPages = [];

        function Book(html) {
            setBook(html);

            this.EnglishbookHeading = englishbookHeading;
            this.Pages = thisPages;
        };

        function setBook(html) {
            var con = $(html); //Context

            ...

            var chapters = tumHadisler.find('div.chapter');
            var index = 0;

            chapters.each(function () {

                var Page = new Page();

                ...

                thisPages[index] = Page;

                index++;
            });
        }

        return Book;
    });

Page.js :

define(function () {

    function Page() {

        this.ChapterId = "";

        ...
    }

    return Page;
});
4

1 に答える 1

0

thisPagesプロパティの値として同じ配列オブジェクトを使用しているBook.Pagesため、すべての本が常にPagesプロパティの同じ値を表すという問題を参照してください。

特定の本にのみページを追加できるようBookに、メソッドへの参照を渡す必要があります。setBook例えば、

   function Book(html) {
        this.EnglishbookHeading = englishbookHeading;
        this.Pages = [];
        setBook(this, html);
    };

    function setBook(book, html) {
        var con = $(html); //Context

        ...

        var chapters = tumHadisler.find('div.chapter');
        var index = 0;

        chapters.each(function () {

            var Page = new Page();

            ...

            book.Pages[index] = Page;

            index++;
        });
    }

別の代替手段はメソッドでリセットthisPagesするsetBookことであり、それもトリックを行います-たとえば、

function setBook(book, html) {
   thisPages = [];   // we are creating new array here that will be used for current book
   var con = $(html); //Context
   ...

あなたのコーディング スタイルとコード構成についてはよくわからないので、あなたに合ったものを選んでください。

于 2013-01-08T09:33:50.540 に答える