Dojo存储行为

时间:2014-03-31 15:13:20

标签: javascript dojo

我开始学习dojo并在GitHub的一个项目中面对非常奇怪的语法。

  dojo.declare('app.services.Favorites', [ dojo.store.Memory ], {

    constructor : function() {
      this.inherited(arguments);

      dojo.subscribe('/favorites/add', dojo.hitch(this, 'put'));
      dojo.subscribe('/favorites/remove', this, function(person) {
        this.remove(person.id);
      });
    },

    put : function() {
      this.inherited(arguments);
      this._save();
    },

    remove : function() {
      this.inherited(arguments);
      this._save();
    },

    _save : function() {
      if (!storage) { return; }
      window.localStorage.setItem('favorites', JSON.stringify(this.data));
    }

  });

  // create an instance that overwrites the constructor
  app.services.Favorites = new app.services.Favorites({
    data : data ? JSON.parse(data) : []
  });

}()

任何人都能解释一下这部分不代表什么意思吗?

dojo.subscribe('/favorites/add', dojo.hitch(this, 'put'));
          dojo.subscribe('/favorites/remove', this, function(person) {

1 个答案:

答案 0 :(得分:1)

这是使用Dojo Topic System,这就像一种全球事件(并且不会以任何方式与商店联系在一起)。

任何代码都可以发布"主题" (只是一个字符串,通常格式化为URL或文件系统路径,以保持事物看起来有条理/作用域),可选地带有数据对象(或更新的Dojo版本中的任意数量的附加参数)。请注意,Dojo 1.7也可以使用dojo/connect模块,但建议使用dojo/topic,尤其是在更高版本中。

// Dojo 1.7+
require(["dojo/topic"], function(topic){
    topic.publish("some/topic", "one", "two");
});

// Dojo 1.7 (AMD)
require(["dojo/_base/connect"], function(connect){
    connect.publish("foobar", [{
        item:"one", another:"item", anObject:{ deeper:"data" }
    }]);
});

// Dojo < 1.7
dojo.publish("foobar", [{
    item:"one", another:"item", anObject:{ deeper:"data" }
}]);

然后,其他代码可以订阅某些主题(同样,使用字符串),并使用所述订阅注册回调函数。再次注意,Dojo 1.7也可以使用dojo/connect模块,但建议使用dojo/topic,尤其是在更高版本中。

// Dojo 1.7+
require(["dojo/topic"], function(topic){
    topic.subscribe("some/topic", function(){
        console.log("received:", arguments);
    });
});

// Dojo 1.7 (AMD)
require(["dojo/_base/connect"], function(connect){
    connect.subscribe("/foo/bar/baz", function(data){
        console.log("i got", data);
    });
});

// Dojo < 1.7
dojo.subscribe("/foo/bar/baz", function(data){
    console.log("i got", data);
});

发布主题时,将通知该主题的任何订阅者(发布和订阅主题字符串必须完全匹配)并执行其回调函数。如果在发布中提供了可选数据对象(或所有其他参数),则将其传递给每个回调函数。

请注意,在发布事件发生后创建订阅将追溯性地触发先前发布的事件的订阅回调。订阅回调仅在发布事件发生时触发。

考虑到使用dojo.subscribe(而不是使用dojo/topic模块),这个GitHub项目看起来使用的是非常旧版本的Dojo。它看起来像Dojo 1.6,而最新的Dojo版本是1.9。 Dojo 1.7在如何访问和弃用之前的方式中引入了很多变化,并且在1.8和1.9中删除了很多旧的方法。

文档(包含相关的Dojo版本):

我强烈建议使用最新的Dojo版本,因此使用dojo/topic模块(包含publishsubscribe方法),而不是使用已弃用的dojo.publish和{ {1}}方法。

取自文档链接的示例代码。