SaaS CMS has officially launched! Learn more now.

postCreate method wasn't called after page load

Vote:
 

Hi,

I've created my own widget 

define([
    "dojo/_base/declare",
    "dojo/_base/connect",
    "dojo/_base/lang",
    "dojo/query",
    "dojo/_base/array",
    "dojo/_base/window",
    "epi-cms/contentediting/editors/SelectionEditor",

    "dijit/_Widget",
    "dijit/_TemplatedMixin",
    "dijit/_WidgetsInTemplateMixin",

    "dojo/text!./Templates/TwoAreas.html"

], function (declare, connect, lang, query, array, window, selectionEditor,
    _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, template) {
    return declare("epi-gadgets.MultiSelect.TwoAreas",
    [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], {
        templateString: template,
        items: null,
        initialValue: null,

        //1
        constructor: function (value) {
            //this.inherited(arguments);
            this.items = value.selections;
            this.initialValue = value.value;
        },

        readOnlyAttr: false,
        //2
        _setValueAttr: function(value) {
            this.setValue(value);
        },
        _setReadOnlyAttr: function(value) {
            this._set("readOnly", value);
            this.readOnlyAttr = value;
        },
        //startup: function() {
        //    this.postCreate();
        //},
        //3
        postCreate: function () {
            // call base implementation            
            this.inherited(arguments);
            for (var i = 0; i < this.items.length; i++) {
                if (this.initialValue && this.initialValue.includes(this.items[i].value)) {
                    this._addOption(this.items[i].value, this.items[i].text, this.selectedOptions);
                } else {
                    this._addOption(this.items[i].value, this.items[i].text, this.availableOptions);
                }
            }

            this.selectButton.setDisabled(this.readOnlyAttr)
            this.removeButton.setDisabled(this.readOnlyAttr)

            this.availableOptions.setDisabled(this.readOnlyAttr)
            this.selectedOptions.setDisabled(this.readOnlyAttr)
        },

        selectionChanged: function (object) {
            var value = this._getValue();
            this._set("value", value);
        },

        addOptions: function (value) {
            var selectedOptions = this._getSelectedValues(this.availableOptions);
            for (var i = 0; i < selectedOptions.length; i++) {
                this._addOption(selectedOptions[i].value, selectedOptions[i].innerHTML, this.selectedOptions);
                this.availableOptions.containerNode.removeChild(selectedOptions[i]);
            }
            this.selectionChanged();
        },

        removeOptions: function (value) {
            var selectedOptions = this._getSelectedValues(this.selectedOptions);
            for (var i = 0; i < selectedOptions.length; i++) {
                this._addOption(selectedOptions[i].value, selectedOptions[i].innerHTML, this.availableOptions);
                this.selectedOptions.containerNode.removeChild(selectedOptions[i]);
            }
            this.selectionChanged();
        },

        _addOption: function (value, text, multiSelect) {
            var option = window.doc.createElement('option');
            option.innerHTML = text;
            option.value = value;
            multiSelect.domNode.appendChild(option);
        },

        _getValue: function () {
            var result = "";
            var addedValues = [];
            var selectedOptions = query("option", this.selectedOptions.containerNode);
            for (var i = 0; i < selectedOptions.length; i++) {

                if (array.indexOf(addedValues, selectedOptions[i].value) != -1) {
                    continue;
                }

                if (i != 0) {
                    result = result + ",";
                }
                result = result + selectedOptions[i].value;
                addedValues[addedValues.length] = selectedOptions[i].value;
            }
            return result;
        },

        _getSelectedValues: function (multiSelect) {
            var result = [];
            var processedValues = [];
            var selectedOptions = query("option", multiSelect.containerNode);
            for (var i = 0; i < selectedOptions.length; i++) {
                if (selectedOptions[i].selected) {
                    if (array.indexOf(processedValues, selectedOptions[i].value) != -1) {
                        continue;
                    }

                    var selectedOptionsByValue = query("option[value=\"" + selectedOptions[i].value + "\"]", multiSelect.containerNode);
                    for (var j = 0; j < selectedOptionsByValue.length; j++) {
                        result[result.length] = selectedOptionsByValue[j];
                    }

                    processedValues[processedValues.length] = selectedOptions[i].value;
                }
            }

            return result;
        },

        setValue: function (value) {
            if (!value) {
                return;
            }

            var options = value.split(",");
            for (var i = 0; i < options.length; i++) {
                var optionsWithValue = query("option[value=\"" + options[i] + "\"]", this.availableOptions.containerNode);
                for (var j = 0; j < optionsWithValue.length; j++) {
                    this._addOption(optionsWithValue[j].value, optionsWithValue[j].innerHTML, this.selectedOptions);
                    this.availableOptions.containerNode.removeChild(optionsWithValue[j]);
                }
            }
        }
    });
});

I am using 'all properties view' as default for all pages and blocks. Application uses EPiServer 7.18

If I select page with my widget than episerver doesn't open all properties view but switch button set to 'all properties view'.

If I change view to 'On-Page editing' and than return to 'All properties' episerver shows properties and my widget.

During debuging I've find out that episerver always calls constructor from my widget after open page but doesn't call postCreate method

 

I hope someone faced with similar issue

#177651
Apr 16, 2017 18:52
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.