最近看到這篇文章Backbone Aura難得的有提到一個web application core該做些什麼事情?跟我想的蠻相似的,這邊將他列出來:

  • 管理widget的life cycle的能力。
  • 低階DOM操作處理
  • 提供publish/subscribe的溝通管道給應用程式的各部位互相溝通

以下是我流解析。

管理widget的life cycle

Core是應用程式的進入點(entry poing),它必須在適當的時機init需要的widget/application part起來做事情,也只有Core才知道什麼時候必須做這些事情。當然也包括在適當的時機讓widget沈睡或消滅。

低階DOM操作

這有點像jQuery library主要在做的事情,不過世界上不是只有jQuery一種library,也不是任何情況下都可以用jQuery,有一個可以快速操作DOM的方法是必要的。

提供publish/subscribe的溝通方式

解耦後的application part/widget當然不能直接呼叫別人的attribute function(不然還解什麼耦),那要怎麼叫別人做事?行之有年的publish/subscribe機制在jmvc已經被整合進去,backbone上面還欠缺方法,backbone aura把這件事做出來了。

然後因為好奇它怎麼做的就看了一下source,在aura/www/js/aura/mediator.js裡面定義了:

/**
 * Subscribe to an event
 * @param {string} channel Event name
 * @param {object} subscription Module callback
 * @param {object} context Context in which to execute the module
 */
obj.subscribe = function (channel, callback, context) {
    channels[channel] = (!channels[channel]) ? [] : channels[channel];
    channels[channel].push(this.util.method(callback, context));
};

/**
 * Publish an event, passing arguments to subscribers. Will
 * call start if the channel is not already registered.
 * @param {string} channel Event name
 */
obj.publish = function (channel) {
    var i, l, args = [].slice.call(arguments, 1);
    if (!channels[channel]) {
        obj.start.apply(this, arguments);
        return;
    }

    for (i = 0, l = channels[channel].length; i < l; i += 1) {
        channels[channel][i].apply(this, args);
    }
};

看起來是利用一個變數來根據widget name儲存callback function進array裡面。

Comments

comments powered by Disqus