WordPress.org

Make WordPress Core

Ticket #24753: 24753.2.diff

File 24753.2.diff, 2.8 KB (added by garyc40, 5 years ago)

properly update model if there's any change

  • wp-includes/js/media-models.js

     
    11window.wp = window.wp || {};
    22
    33(function($){
    4         var Attachment, Attachments, Query, compare, l10n, media, bindSyncEvents;
     4        var Attachment, Attachments, Query, compare, l10n, media;
    55
    66        /**
    77         * wp.media( attributes )
    window.wp = window.wp || {}; 
    6767                        return a > b ? -1 : 1;
    6868        };
    6969
    70         // Ensures the 'sync' and 'error' events are always
    71         // correctly triggered when overloading `Backbone.sync`.
    72         bindSyncEvents = function( model, options ) {
    73                 var success = options.success,
    74                         error = options.error;
    75 
    76                 options.success = function( resp ) {
    77                         if ( success )
    78                                 success( resp );
    79                         model.trigger( 'sync', model, resp, options );
    80                 };
    81 
    82                 options.error = function( xhr ) {
    83                         if ( error )
    84                                 error( xhr );
    85                         model.trigger( 'error', model, xhr, options );
    86                 };
    87 
    88                 return options;
    89         };
    90 
    9170        _.extend( media, {
    9271                /**
    9372                 * media.template( id )
    window.wp = window.wp || {}; 
    197176                                        action: 'get-attachment',
    198177                                        id: this.id
    199178                                });
    200                                 bindSyncEvents( model, options );
    201179                                return media.ajax( options );
    202180
    203181                        // Overload the `update` request so properties can be saved.
    window.wp = window.wp || {}; 
    226204                                        }, this );
    227205                                }
    228206
    229                                 bindSyncEvents( model, options );
    230207                                return media.ajax( options );
    231208
    232209                        // Overload the `delete` request so attachments can be removed.
    window.wp = window.wp || {}; 
    244221                                        _wpnonce: this.get('nonces')['delete']
    245222                                });
    246223
    247                                 bindSyncEvents( model, options );
    248224                                return media.ajax( options ).done( function() {
    249225                                        this.destroyed = true;
    250226                                }).fail( function() {
    window.wp = window.wp || {}; 
    506482                        return this.mirroring ? this.mirroring.hasMore() : false;
    507483                },
    508484
     485                parse: function( resp, xhr ) {
     486                        if ( ! _.isArray( resp ) )
     487                                resp = [resp];
     488
     489                        return _.map( resp, function( attrs ) {
     490                                var id, attachment;
     491                                if ( attrs instanceof Backbone.Model ) {
     492                                        id = attrs.get( 'id' );
     493                                        attrs = attrs.attributes;
     494                                } else {
     495                                        id = attrs.id;
     496                                }
     497
     498                                attachment = Attachment.get( attrs.id );
     499                                if ( ! _.isEqual( attachment.attributes, attrs ) )
     500                                        attachment.set( attachment.parse( attrs, xhr ) );
     501
     502                                return attachment;
     503                        });
     504                },
     505
    509506                _requery: function() {
    510507                        if ( this.props.get('query') )
    511508                                this.mirror( Query.get( this.props.toJSON() ) );
    window.wp = window.wp || {}; 
    701698                                        args.paged = Math.floor( this.length / args.posts_per_page ) + 1;
    702699
    703700                                options.data.query = args;
    704                                 bindSyncEvents( model, options );
    705701                                return media.ajax( options );
    706702
    707703                        // Otherwise, fall back to Backbone.sync()