1

この JsFiddle で: http://jsfiddle.net/maxl/mCXND/

( http://jsfiddle.net/ud3323/XMgwV/からコピーおよび変更)

JQuery に基づいて Ember DatePicker を作成しようとしています。

私が最初に遭遇する問題は、次の行です。

var ui = jQuery.ui[this.get('uiType')](options, this.get('element'));

jQuery.ui[this.get('uiType')] は関数を返さないため、私が始めたソリューションは一部の jQueryUI ウィジェットでは機能しますが、すべてでは機能しないと思います。すべての JQuery-UI ウィジェット、特に JQueryUI の Datepicker で機能するソリューションが必要です。

ありがとう

4

2 に答える 2

3

jqueryui コードを見ると、関数として呼び出されるものとそうでないものがあることがわかります。これを使用して解決できます:

var ui;
if (typeof jQuery.ui[this.get('uiType')] === 'function') {
   ui = jQuery.ui[this.get('uiType')](options, this.get('element'));
} else {
   ui = this.$()[this.get('uiType')](options);
}

作業例: http://jsfiddle.net/PzsrT/7/

于 2012-05-03T18:58:52.050 に答える
2

EmberJS Mixin としての jQuery UI の datepicker ウィジェットについてもう 1 つ。beforeShowDay イベントを処理するコールバック関数を提供する場合は、次のエラーが発生します。

Uncaught TypeError: Cannot read property '0' of undefined

jqueryui docで指定されているように、コールバック関数(emberビュー内)が配列を返す場合でも

  beforeShowDay: function(date){
    some code...
    return [true, ''];
  };

これは、_gatherEvents 関数の callback.call の後に何も返されないために発生します。

  _gatherEvents: function(options) {
    var uiEvents = this.get('uiEvents') || [], self = this;

    uiEvents.forEach(function(event) {
      var callback = self[event];

      if (callback) {
        // You can register a handler for a jQuery UI event by passing
        // it in along with the creation options. Update the options hash
        // to include any event callbacks.
        options[event] = function(event, ui) { callback.call(self, event, ui); };
      }
    });
  }

これを修正するには、return ステートメントを callback.call の前に追加します。

_gatherEvents: function(options) {
    var uiEvents = this.get('uiEvents') || [], self = this;

    uiEvents.forEach(function(event) {
      var callback = self[event];

      if (callback) {
        // You can register a handler for a jQuery UI event by passing
        // it in along with the creation options. Update the options hash
        // to include any event callbacks.
        options[event] = function(event, ui) { return callback.call(self, event, ui); };
      }
    });
  }

実例http://jsfiddle.net/thibault/qf3Yu/

于 2012-10-03T17:49:18.230 に答える