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 を使用するのはこれが初めてなので、何か根本的に間違っている可能性があります。
誰でも私にポインタを教えてもらえますか?
どうもありがとうアル