宇凡's profileBreak the LoopPhotosBlogLists Tools Help

Blog


    March 14

    Live.com Gadget机制思考

    Live.com是基于Atlas框架的一个web2.0应用,其实就Atlas Binding部分,无非是一个封装不错的Ajax框架,甚至提供了跨域数据交换的基础类。因此我觉得通过prototype或者其他开源的js库模仿live.com的机制实现类似的库也是有可能的。首先这是一个最简单的gadget代码:
    registerNamespace("mikeo"); // 这里首先注册一个名称空间,类似java的package mikeo
     
    // 接下来是定义一个test类
    mikeo.test = function(p_elSource, p_args, p_namespace) {
      mikeo.test.initializeBase(this, arguments);
      var m_version = "1.0";
      var m_module = p_args.module;
      /****************************************
      ** Public Methods
      ****************************************/
      this.initialize = function(p_objScope) { // initialize方法将在gadget被添加到live.com page的时候调用
        mikeo.test.getBaseMethod(this, "initialize", "Web.Bindings.Base").call(this, p_objScope); // 调用父类的初始化方法,感觉这里设计的比较笨拙
        //TODO: add your initialization code here
        var contentArea = document.createElement("div"); // 创建一个容器层
        contentArea.innerText = "Xbox 360 Rulz"; // 设置层的内容
        p_elSource.appendChild(contentArea); // 将层添加到父容器,在界面上就是会多一个gadget的显示了,其中有xbox 360 rulz一行字
      };
      mikeo.test.registerBaseMethod(this, "initialize"); // 不是很明白,难道不能自动化完成?
      this.dispose = function(p_blnUnload) { // 释放方法,到用户从page删除该gadget的某个实例时调用,用以释放该gadget占用的资源,这个可是体现程序员风度的地方
        mikeo.test.getBaseMethod(this, "dispose", "Web.Bindings.Base").call(this, p_blnUnload); // 同理,调用父类的释放函数
        //TODO: add your dispose code here
      };
      mikeo.test.registerBaseMethod(this, "dispose");
      /****************************************
      ** Private Methods
      ****************************************/
      function SavePrefs() {
        if (p_args.onDashboard) {
          var params = m_module.GetBindingParams();
          if (!params) {params = new Object();}
          //TODO: Add any data that we want to store here
          //ex: params.color = "red";
          m_module.Serialize();
        }
      }
    };
    mikeo.test.registerClass("mikeo.test", "Web.Bindings.Base");
     
    是不是很简单? 我初步构思的Prototype版本:
    var ivan = Namespace.create("Ivan"); // 面向对象的Namespace,目前还只是个hash,将来可以增加一些方法,如inspect赫赫
    ivan.Test = Class.create(); // prototype里的Class
    ivan.Test.prototype = {
         // initialize和dispose方法被调用的时候,会被拦截,动态或者静态的注入一些代码,如调用父类的对应方法
         initialize:function(parentElement) {
          // TODO your initialize code here
        },
        dispose:function() {
         // TODO your dispose code here
        }
    }
     
    Object.extend(ivan.Test, Huiye.BaseGadget); // 需要改在这个extend,使他不是直接覆盖父类的同名方法,而是创建一个别名,或者存到一个私有变量内,以便需要的时候被子类调用。
     
     
    另外发现live.com的gadget是分是否经过审核的,经过审核的gadget直接运行于page中,而没有经过审核的其实是在一个独立的iframe中运行,以免不良代码破坏页面上的其他代码运行。