2

EPiServer 用の dijit ウィジェットを開発しました。ウィジェット内には、REST ストアからデータを取得する FilteringSElect があります。FilteringSelect に入力される値は、数値 ID とテキスト値です。

EPiServer が値を保存するとき、保存されるのは数値 (Id) です。

私のウィジェット全体は次のようになります。

{

return declare("communityuser.editors.CommunityUserSelector", [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _CssStateMixin, _ValueRequiredMixin], {

    templateString: "<div class=\"dijitInline\">\
                        <div data-dojo-attach-point=\"stateNode, tooltipNode\">\
                            <div data-dojo-attach-point=\"inputWidget\" data-dojo-type=\"dijit.form.FilteringSelect\" style=\"width: 300px\"></div><span style=\"padding-left:10px;\"><a href=\"#\" data-dojo-attach-point=\"resetLink\">Reset</a></span>\
                        </div>\
                    </div>",

    intermediateChanges: false,

    value: null,

    store: null,

    onChange: function (value) {
        // Event
    },

    postCreate: function () {
        // call base implementation
        this.inherited(arguments);

        // Init textarea and bind event
        this.inputWidget.set("intermediateChanges", this.intermediateChanges);

        //set whether the internal required property is true
        this.inputWidget.set('required', false);

        //get a reference to the CommunityUserStore
        var registry = dependency.resolve("epi.storeregistry");
        this.store = this.store || registry.get("customquery");

        //set the store for the FilteringSelect
        this.inputWidget.set("store", this.store);

        //connect the onChange event for the FilteringSelect
        this.connect(this.inputWidget, "onChange", this._onInputWidgetChanged);

        //connect the onclick event for the Reset Link
        this.connect(this.resetLink, "onclick", this._onResetClicked);
    },

    isValid: function () {
        // summary:
        //    Check if widget's value is valid.
        // tags:
        //    protected, override

        return true;
    },

    // Setter for value property
    _setValueAttr: function (value) {

        if (!value) {
            return;
        }

        //set the value of the FilteringSelect and the value of the parent control
        this.inputWidget.set("value", value.userId);
        this._set("value", this._serializeUser(value));
    },

    // Event handler for the changed event of the input widget
    _onInputWidgetChanged: function (value) {

        this._updateValue(value);
    },

    //Event handler when the Selection in the FilteringSelect is changed
    _updateValue: function (value) {

        //check whether the initial value matches the new value i.e. the value after the selection has changed
        if (this._started && epi.areEqual(this.value, this._serializeUser(value))) {
            return;
        }

        //create an object representation of the value
        var formattedValue = (!value) ? {} : this._serializeUser(value);

        this._set("value", formattedValue);
        this.onChange(formattedValue);
    },

    _onResetClicked: function (event) {

        event.preventDefault();
        this.inputWidget.reset();

    },

    _serializeUser: function(userId) {

        return ({userId: userId });

    },

});

これは、dojo/dijit ウィジェットを作成する正しい方法ではない可能性があります。これは私の最初の方法です。

私の Rest Store には、Get(string name) と GetUserById(int userId) の 2 つのメソッドがあります。

Get メソッドの値が返されます。おそらく、Get は Dojo が探しているデフォルトのメソッドだからです。したがって、ユーザーが FilteringSelect に値を入力するか、FilteringSelect からプルダウンを選択すると、ロード後に、Get メソッドから返されたすべての値が取り込まれます。

ただし、ウィジェットがロードされたときにすでに値がある場合 (EPiServer に保存されているため)、ストアから別のメソッドを呼び出して、1 つのレコードのみを返したいと考えています。この場合、返されるレコードは、そのユーザー アカウントになります。同じIDを持っています。

ID | 値 1 | "ユーザー 1" 2 | "ユーザー 2" 3 | 「ユーザー3」

私が苦労しているのは、ストアからメソッドを呼び出し、FilteringSelect で返された値を表示する方法です。

dojo または dijit を使用するのはこれが初めてなので、何か根本的に間違っている可能性があります。

誰でも私にポインタを教えてもらえますか?

どうもありがとうアル

4

1 に答える 1

3

FilteringSelect には、「searchAttr」、「labelAttr」、「value」の 3 つの属性を設定できます。「searchAttr」をデータのプロパティ名に設定してフィルタリング検索を実行し、「labelAttr」を UI に表示されるデータのプロパティ名に設定し、「value」を現在選択されている ID として設定できます。お気に入り

var selector = new FilteringSelect({
    searchAttr:"label",  //label is property name in your data
    labelAttr:"label", 
    required:false,
    value:"selectedId",
    store: dojo.store.Observable(new dojo.store.Memory({
        idProperty:"name",   //if your store key property is not "id", instead of it is "name", you can set like this
        data: []    
    }))
    }, dojo.create("span", null, yourDiv)
);

使用できます

selector.get('value);
selector.set('value', yourValue); 

_setValueAttr および _set をコードで直接使用することはお勧めしません。

この助けを願っています。

于 2013-10-04T17:53:42.470 に答える