Estoy usando KnockoutJS y tratando de suscribirse a un observable que está en un observableArray que está en un observableArray. Así que mi viewModel se parece a esto…

function viewModel() {
    //private properties
    var self = this;

    //public properties
    self.movies = ko.mapping.fromJS([]);

    //subscriptions
    self.movies.UserMovies.Rating.subscribe(function(newValue) {
        console.log(newValue);
    });
}

La movies observableArray sería esto una vez que se rellena a partir de la asignación de un plugin…

[{
    Id: 1,
    Title: 'Movie1',
    Year: 2010,
    UserMovies: [{ Id: 11, Rating: 3.5, IsWatched: true }]
},{
    Id: 2,
    Title: 'Movie2',
    Year: 2010,
    UserMovies: [{ Id: 4, Rating: 4, IsWatched: true }]
}]

Estoy tratando de configurar una suscripción UserMovies.Clasificación pero, desde mi anterior viewModel llegar el mensaje de error

TypeError: auto.en las películas.UserMovies es indefinido

¿Cómo tengo acerca de la configuración de una suscripción a UserMovies.Rating cuando se rellena a partir de la asignación de plugin?

Puede utilizar la última versión de este plugin si quieres en profundidad de suscripción a las matrices: github.com/ZiadJ/knockoutjs-reactor

OriginalEl autor bflemi3 | 2012-12-20

3 Comentarios

  1. 7

    Knock-out no proporciona el nivel de detalle para saber que los elementos modificados en un array, que algo cambiado. Usted necesitará un bucle a través de la matriz cada vez que un artículo se ha añadido o quitado.

    La foreach de unión (a través de ko.utils.compareArrays) calcula el número mínimo de operaciones para transformar una matriz en otra, de modo que DOM-elementos no necesitan ser recreado.

    Utilizando ko.utils.compareArrays, yo era capaz de crear un método que se adhiere a la matriz de cambios a nivel de artículo. Aprovechando esto, yo podría escribir un select método que se encarga de las suscripciones.

    http://jsfiddle.net/MizardX/s9M4z/

    Con la nueva select método, usted podría hacer esto bastante concisa:

    //Subscribe to items added to the array. The returned 'subscription' will be
    //disposed of, when the item is later removed.
    viewModel.movies.select(function (movie) {
    
        //Return the subscription. Same as above.
        return movie.UserMovies.select(function (userMovie) {
    
            //Subscribe to a non-array. The callback will receive the updated value,
            //instead of the an added item.
            return userMovie.Rating.select(function (rating) {
    
                //Executed each time a rating is updated.
                console.log(movie.Id(), userMovie.Id(), rating);
            });
        });
    });

    Se encarga de adiciones, actualizaciones y eliminaciones como se esperaba.

    Esta es una gran respuesta. Gracias Markus 🙂
    Yo no estaba satisfecho con la versión anterior, ya que no podía manejar eliminaciones. Este es más robusto.

    OriginalEl autor Markus Jarderot

  2. 2

    Creo que tendrás un bucle a través de sus películas y suscribirse a cada uno de la clasificación de los bienes:

    $.each(self.movies(), function(i, movie) { 
         movie.Rating.subscribe(function(newRatingValue){  /* ... */ }) 
    });

    De curso de la donwside aquí es que usted también tendrá que suscribirse a la propia matriz, para situaciones en las que añadir nuevas películas a la matriz, y luego manualmente suscribirse a los cambios en sus valor de clasificación así.

    OriginalEl autor Adam Rackis

  3. 0

    Usted puede suscribirse a sus propiedades en esto de la moda:

       var UserMovies = function (data) {
            this.Id = ko.observable();
            this.Rating = ko.observable();
            this.IsWatched = ko.observable();
            this.update(data);
        }
    
        ko.utils.extend(UserMovies.prototype, {
            update: function (data) {
                this.Id(data.Id || "");
                this.Rating(data.Rating || "");
                this.Rating.subscribe(function (newValue) {
                    console.log(newValue);
                });
                this.IsWatched(data.IsWatched || "");
            }
        });

    No estoy seguro de lo que usted podría ser capaz de hacer o de no hacer que se suscriban a las cosas dentro de su objeto, pero esto no funciona. Tampoco estoy seguro de si cada suscripción será única, o si un cambio en la Calificación que pondrá en marcha todos los UserMovies clasificaciones de las suscripciones. No he probado eso. Yo sólo he utilizado este en objetos individuales y no de las matrices de objetos.

    OriginalEl autor Barry Franklin

Dejar respuesta

Please enter your comment!
Please enter your name here