<commit_before>/**
 * Views collection
 * @see https://github.com/pasaran/noscript/blob/master/doc/ns.viewCollection.md
 * @namespace
 * @augments ns.View
 * @constructor
 * @borrows ns.View.define as define
 */
ns.ViewCollection = function() {};

no.inherit(ns.ViewCollection, ns.View);

ns.ViewCollection.define = function(id, info) {
    info = info || {};
    var ctor = ns.View.define(id, info, ns.ViewCollection);

    // check for modelCollection
    for (var model_id in info.models) {
        // get lite info to prevent info processing
        if (ns.Model.infoLite(model_id).isCollection) {
            // Пока можно подписывать viewCollection только на одну modelCollection
            if (info.modelCollectionId && model_id !== info.modelCollectionId) {
                throw new Error("[ns.ViewCollection] '" + id + "' must depends on single ns.ModelCollection only");

            } else {
                info.modelCollectionId = model_id;
                info.isCollection = true;
            }
        }
    }

    if (!info.modelCollectionId) {
        throw new Error("[ns.ViewCollection] '" + id + "' must depends on ns.ModelCollection");
    }

    if (!info.split || !info.split['view_id']) {
        throw new Error("[ns.ViewCollection] '" + id + "' must defines split.view_id");
    }

    return ctor;
};

ns.ViewCollection.prototype._init = function() {
    ns.View.prototype._init.apply(this, arguments);

    this.views = {};
};

/**
 * Биндится на изменение моделей.
 * @private
 */
ns.ViewCollection.prototype._bindModels = function() {
    var that = this;
    var models = this.models;

    for (var model_id in models) {
        var model = models[model_id];

        model.on('ns-model-destroyed', function(e, o) {
            // проинвалидируем view, только если изменилась внешняя модель
            if (!o || this === o.model) {
                that.invalidate();
            }
        });

        model.on('ns-model-changed', function(e, o) {
            // проинвалидируем view, только если изменилась внешняя модель
            if (this === o.model) {
                that.invalidate();
            }
        });
    }
};

ns.ViewCollection.prototype.isValid = function() {
    return this.isValidSelf() && this.isValidDesc();
};

ns.ViewCollection.prototype.isValidDesc = function() {
    for (var key in this.views) {
        if (!this.views[key].isValid()) {
            return false;
        }
    }
    return true;
};
<commit_msg>fix check for ns-model-changed in viewCollection<commit_after>/**
 * Views collection
 * @see https://github.com/pasaran/noscript/blob/master/doc/ns.viewCollection.md
 * @namespace
 * @augments ns.View
 * @constructor
 * @borrows ns.View.define as define
 */
ns.ViewCollection = function() {};

no.inherit(ns.ViewCollection, ns.View);

ns.ViewCollection.define = function(id, info) {
    info = info || {};
    var ctor = ns.View.define(id, info, ns.ViewCollection);

    // check for modelCollection
    for (var model_id in info.models) {
        // get lite info to prevent info processing
        if (ns.Model.infoLite(model_id).isCollection) {
            // Пока можно подписывать viewCollection только на одну modelCollection
            if (info.modelCollectionId && model_id !== info.modelCollectionId) {
                throw new Error("[ns.ViewCollection] '" + id + "' must depends on single ns.ModelCollection only");

            } else {
                info.modelCollectionId = model_id;
                info.isCollection = true;
            }
        }
    }

    if (!info.modelCollectionId) {
        throw new Error("[ns.ViewCollection] '" + id + "' must depends on ns.ModelCollection");
    }

    if (!info.split || !info.split['view_id']) {
        throw new Error("[ns.ViewCollection] '" + id + "' must defines split.view_id");
    }

    return ctor;
};

ns.ViewCollection.prototype._init = function() {
    ns.View.prototype._init.apply(this, arguments);

    this.views = {};
};

/**
 * Биндится на изменение моделей.
 * @private
 */
ns.ViewCollection.prototype._bindModels = function() {
    var that = this;
    var models = this.models;

    for (var model_id in models) {
        var model = models[model_id];

        model.on('ns-model-destroyed', function(e, o) {
            // проинвалидируем view, только если изменилась внешняя модель
            if (!o || this === o.model) {
                that.invalidate();
            }
        });

        model.on('ns-model-changed', function(e, o) {
            // проинвалидируем view, только если изменилась внешняя модель
            if (!o || this === o.model) {
                that.invalidate();
            }
        });
    }
};

ns.ViewCollection.prototype.isValid = function() {
    return this.isValidSelf() && this.isValidDesc();
};

ns.ViewCollection.prototype.isValidDesc = function() {
    for (var key in this.views) {
        if (!this.views[key].isValid()) {
            return false;
        }
    }
    return true;
};

{'fraction_non_alphanumeric': 0.13548128877326396, 'fraction_numerical': 0.0, 'mean_word_length': 2.2838370565045993, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5903126', 'n_tokens_mistral': 1499, 'n_tokens_neox': 1530, 'n_words': 338}