mootoolsでチェーンを設定するのは簡単です。しかし、MixinとしてChainクラスを使用することはもう少し複雑になる可能性があります。
通常、Fxベースのクラスとメソッドの連鎖に向いていますが、同期しているものではありません。演奏中にlink: chain
のトゥイーンエフェクトがあるとしたら、.chain(function() {})
の後に何か別のことをすることができます。
the callChain exampleスタンドアロンとしては十分に簡単で十分ですが、タイミング制御の点ではほとんどありません。
リニアタイムラインアプローチがあります。あなたの場合、最初のコールバックは20 ms、1980 ms後に実行され、2回目、3回目は1680 ms後に実行されます。連続する各ステップが次のステップを呼び出すように連鎖する場合は、そのことを考慮に入れて、実際には2つのアクションの間に待機する時間を渡す必要があります。
もう1つの方法は、最初からやり直しておくことです。
私はここにかつての少しの合理化で行くを持っていた:http://jsfiddle.net/dimitar/mpzzq/
(function(){
Chain.implement({
slowChain: function(duration){
// console.log(duration);
this.callChain.delay(duration === null ? 500 : duration, this);
}
});
var db = $(document.body);
var fixBody = function(cn, delay) {
console.log(arguments);
db.addClass(cn);
console.log(cn, delay);
if (this.$chain.length) {
this.slowChain(delay || 0);
}
};
var myChain = new Chain(),
funcs = [{
fn: fixBody,
args: ["load"],
delay: 1980
}, {
fn: fixBody,
args: ["load-two"],
delay: 700
}, {
fn: fixBody,
args: ["load-three"],
delay: 2000
}, {
fn: fixBody,
args: ["load-four"],
delay: 0
}];
myChain.chain(
funcs.map(function(el) {
el.args.push(el.delay);
return el.fn.bind.apply(el.fn, [myChain].concat(el.args));
})
);
document.getElement("button").addEvents({
click: function() {
myChain.slowChain(20);
}
});
})();
ので、オブジェクトの私のfuncs配列で、私は、上で渡す引数や遅延をFUNCコールバックを定義します。 func自体にはthis
スコープがチェーンインスタンスに設定されており、チェーンの次のセルフコールが呼び出されますが、これを簡単に修正して使用することができます。
願っています。その
// function decorator.
Function.implement({
chainDelay: function(delay, bind) {
// allows you to set a delay for chained funcs and auto call stack (if bind is a chain instance)
var self = this,
args = (arguments.length > 2) ? Array.slice(arguments, 2) : null;
return function() {
setTimeout(function() {
self.apply(bind, args.concat(Array.from(arguments)));
if (bind && bind.$chain && bind.$chain.length)
bind.callChain.call(bind);
}, delay);
}
},
justChain: function(bind) {
// runs a chained func when due and auto calls stack for next (if bind is a chain instance and avail)
var self = this, args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
return function() {
self.call(bind, args);
if (bind && bind.$chain && bind.$chain.length)
bind.callChain.call(bind);
}
}
});
var moo = new Chain();
moo.chain(
// some delayed ones.
(function(what) {
console.log(what);
}).chainDelay(3000, moo, "hi"),
(function(what, ever) {
console.log(what, ever);
}).chainDelay(3000, moo, "there", "coda"),
(function(what) {
new Element("div[id=foo][html=" + what +"]").inject(document.body);
}).chainDelay(1000, moo, "mootools FTW!"),
// regular ones here for good measure!
(function() {
document.id("foo").setStyle("color", "red")
}).justChain(moo),
(function() {
document.id("foo").setStyle("background-color", "blue")
})
);
moo.callChain();
例:http://jsfiddle.net/dimitar/Y4KCB/4/
おかげで、デモやこれを説明するために時間を割いて多く
は、ここではそれが遅延にチェーンを呼び出すデコレータ機能付きテイク2です。作成したサンプルをよく見て、どの方法が最高のパフォーマンスを発揮するかを試してみましょう。再度、感謝します。 :) – Dave
take 2でこれをチェックしてください。私は関数デコレータ/メソッドを使ってより良い方法を考えています。 http:// jsfiddle。net/dimitar/Y4KCB/ –
これを調べていただき、ありがとうございました。それは確かに私が考えていたよりも複雑な質問です、あなたの意見を持ってうれしいです。乾杯。 – Dave