6
function Observer() {
    this.fns = [];
}

Observer.prototype = {
    subscribe : function(fn) {
        this.fns.push(fn);
    },

    unsubscribe : function(fn) {
        this.fns = this.fns.filter(
            function(el) {
                if ( el !== fn ) {
                    return el;
                }
            }
        );
    },

    fire : function(o, thisObj) {
        var scope = thisObj || window;
        this.fns.forEach(
            function(el) {
                el.call(scope, o);
            }
        );
    }
};


var fn = function() {};

var o = new Observer;
o.subscribe(fn);
o.fire('here is my data');
o.unsubscribe(fn);

この背後にある概念全体を理解することはできません。このパターンをプロジェクトに実装したいと考えています。フォームが送信され、WebService を呼び出して応答を返すビューがあります。

これを単純な要求と応答であるプロジェクトに実装する必要がある場合...どうすればよいでしょうか? 変更があったときにオブザーバーに通知することを理解しています...APIにリクエストを送信すると、応答が返されます...今度は、監視可能なパターンを介してビューに通知されるようにします

4

2 に答える 2

4

オブザーバーは、呼び出すコンストラクターのように見えます。var o = new Observer();その後o、一連の関数への参照を持つオブジェクトになります。を介してリストに機能を追加しますsubscribe。それらをリストから削除しますunsubscribe

そのすべての要点はfire、関数リストをループし、各関数を 1 つずつ呼び出すメソッドです。"observer pattern"シングルトンパターンによく似ているようです

watchJavaScriptの " " メソッドに精通していますか? これは、Firefox でサポートされているメソッドであり、任意のオブジェクトで使用できます。

document.myform.myfield.watch('value', function (v) {
    alert(v);
    return v;
})

オブジェクトの値が変更されるたびに、watch関数が呼び出されます。つまり、基本的にオブザーバー パターンの背後にある概念は、Firefox の watch メソッドをクロスブラウザー方式で基本的にシミュレートしたいということです。

一連の関数またはオブジェクトへの参照をサブスクライブに投げ、監視対象のオブジェクトまたは関数のそれぞれでコールバック メソッドを呼び出しますlist.thenそのようにして、ユーザーがクリックなどの何らかのアクションを実行すると、関数のリスト全体がコールバック関数を介して更新されますObserver.fire

これが役立つことを願っています。

于 2012-04-25T11:13:46.103 に答える
0

単純なリクエストのみを実行したい場合は、jQuery(with$.ajax(...)やなど$.get(...))で次のようになります。

var requestUrl = "text.html";

// Callback is defined here
var viewCallback = function(data) {
   // this will be called when the request is done
   console.log('view is notified');
   console.log('data looks like this:');
   console.log(data);

   // you could chain method calls to other callbacks here if you'd like
};

// Request is done here
$.ajax({
  url: requestUrl,
}).done(viewCallback);

ほとんどの場合、上記で十分なコードであるリクエストを実行するときに、1つのことだけを実行したいと考えています。jQueryやmootoolsなどのjavascriptライブラリを使用すると、XMLHttpRequestオブジェクトの奇妙な部分が抽象化されます。

ただし、もっと高度なことをしたい場合は、Radio.jsなどのこの種のことを行うライブラリを調べることをお勧めします。

于 2012-04-25T11:05:12.843 に答える