2

私はこのようなことをすることに慣れています:

$(some_elements)
   .filter(function() { return $(this).jqmData("locked") !== true; })
       .jqmData('locked', true )
       .each( function(){
         // stuff
       });

そのため、フィルター呼び出しはすべての「ロック解除された」要素を選択し、それらに対して関数を実行してロックするため、次回は除外されます。

現在、ウィジェットファクトリー関数内でこのフィルターを使用しようとしています:

...
_create: function() {
    var self = this;
    self.refresh( true );
},

refresh: function ( create ) {
...
    $filter
        .submit( function( e ) {
            e.preventDefault();
            search.blur();
        })
        .bind( "submit", function() {
            return false;
        })
        .filter(function() { return this.getAttribute( "data-override" ) !== false; })
            .find( "input" )
                .bind( "keyup change input", self.filter( e, kids ) )
                .end()
            .end()
        .prepend( o.target || $( container ) );
},
...

ここで使用しているとき、 の呼び出しによって関数がfilter()再トリガーされ、_createその理由がわかりません。フィルターを省略しても、すべて正常に機能するため、フィルター呼び出しに含まれている必要があります。

質問:
filter() 関数で何が間違っていますか?

編集:
したがって、これはチェーンされていませんが機能します:

 $filter
    .submit( function( e ) {
        e.preventDefault();
        search.blur();
    })
    .prependTo( $( o.target ) || $( el ) );

 if ( $(this).jqmData("override") === false ) {
    $filter
        .find( "input" )
        .bind( "keyup change input", function() {
            self.filter( e, kids );
        });
 }

これはしませんが(再起動します_create):

$filter
    .submit( function( e ) {
        e.preventDefault();
        search.blur();
    })
    .filter( function() {
        console.log($(this).data("override"))
        return $(this).data("override");
    })
    .find("input")
        .bind( "keyup change input", function() {
            self.filter( e, kids );
    })
    .end()
    .end()
    .prependTo( $( o.target ) || $( el ) );
4

1 に答える 1

1

これら 2 つのイベント ハンドラーはまったく同じです。

.submit( function( e ) {
        e.preventDefault();
        search.blur();
    })
    .bind( "submit", function() {
        return false;
    })

これはすぐに関数を実行し、結果を返します:

.bind( "keyup change input", self.filter( e, kids ) )

おそらく次のようになります。

    .bind( "keyup change input", function() {
       self.filter( e, kids );
    })
    .end() ....

そして、あなたは次のようになります:

$filter.on('submit',function (e) {
    e.preventDefault();
    search.blur();
}).filter(function() {
    return $(this).data("override");
}).find("input").on('keyup change input', function() {
    self.filter(e, kids);
}).end().end().prepend(o.target || $(container);

また

$filter.prependTo(o.target || $(container)
       .on('submit',function (e) {
           e.preventDefault();
           search.blur();
     }).filter(function() {
           return $(this).data("override");
     }).find("input")
       .on('keyup change input', function() {
           self.filter(e, kids);
 });
于 2013-03-24T17:47:49.097 に答える