Закрытие функций JS с ошибкой AngularJS Services - PullRequest
0 голосов
/ 01 января 2019

Я создаю фабрику MovieCollections в AngularJS с закрытием функции JS, так что у меня есть закрытые переменные и методы.Фабрика в основном несет коллекции фильмов в списке.С помощью открытых методов removeMovie(), updateMovie(), viewMovies(), prestineMovies() коллекция фильмов может быть обновлена.Коллекция фильмов хранится в закрытой переменной movieCollection.

. Проблема в том, что изменения updateMovie() распространяются на метод viewMovies() перед ним.

У меня естьпопытался запустить замыкание с Node.JS и удалить Local Storage вместе с угловым кодом.Никаких проблем не возникало.

Я использовал следующий код:

var app = angular.module('app');

function movieCollectionCreation(){
// private
movieCollection = [];

// prestine movieCollection
function prestineMovieCollection(){
    movieCollection = [
        {
            id: 0,
            name: "Avatar",
            year: 2012,
            rating: 4.8
        },
        {
            id: 1,
            name: "WestWorld",
            year: 2013,
            rating: 3.6
        },
        {
            id: 2,
            name: "Titanic",
            year: 2001,
            rating: 3.9
        }
    ]

// public
return {
    removeMovie: function(id){
        // Will hold the index in the array that contains movieId
        index = -1;

        movieCollection.forEach(function(element, arrayIndex) {
            if(element.id === id){
                index = arrayIndex;
            }
        });

        movieCollection.splice(index, 1);

        window.localStorage.setItem("movieCollection", JSON.stringify(movieCollection));
    },
    updateMovie: function(id, movieObj){
        isMovieObjValid(movieObj);
        this.removeMovie(id);
        movieObj.id = id;
        movieCollection.push(movieObj);
        window.localStorage.setItem("movieCollection", JSON.stringify(movieCollection));
    },
    viewMovies: function(){
        console.log(movieCollection);
    },
    prestineMovies: function(){
        prestineMovieCollection();
        window.localStorage.setItem("movieCollection", JSON.stringify(movieCollection));
    }
}
};

app.factory("MovieCollection", movieCollectionCreation);

app.controller('MovieCollectionTestingController', function(MovieCollection){
MovieCollection.viewMovies();

MovieCollection.updateMovie(0, {
    name: "Avators",
    year: 2012,
    rating: 4.8
});

MovieCollection.viewMovies();

MovieCollection.prestineMovies();
});

Я ожидал следующих результатов:

(3) [{…}, {…}, {…}]
0: {id: 1, name: "WestWorld", year: 2013, rating: 3.6}
1: {id: 2, name: "Titanic", year: 2001, rating: 3.9}
2: {name: "Avatar", year: 2012, rating: 4.8, id: 0}

(3) [{…}, {…}, {…}]
0: {id: 1, name: "WestWorld", year: 2013, rating: 3.6}
1: {id: 2, name: "Titanic", year: 2001, rating: 3.9}
2: {name: "Avators", year: 2012, rating: 4.8, id: 0}

Но получил следующее:

(3) [{…}, {…}, {…}]
0: {id: 1, name: "WestWorld", year: 2013, rating: 3.6}
1: {id: 2, name: "Titanic", year: 2001, rating: 3.9}
2: {name: "Avators", year: 2012, rating: 4.8, id: 0}

(3) [{…}, {…}, {…}]
0: {id: 1, name: "WestWorld", year: 2013, rating: 3.6}
1: {id: 2, name: "Titanic", year: 2001, rating: 3.9}
2: {name: "Avators", year: 2012, rating: 4.8, id: 0}

Изменения updateMovie() изменения имени на "Avators" с "Avatar" передаются методу viewMovies() перед этим.

...