我正在为我的工作创建一种基于调解器的库。我们创建了很多应用程序,所以我想要一些可以在每个应用程序的基础上轻松获取和修改的东西。我还希望它足够容易地创建“小部件”(因为缺少更好的术语)并且可以轻松删除它们而不用担心破坏任何东西。我们制作的许多这些应用程序也可以由外部开发人员进行扩展,这些开发人员制作应用程序或为应用程序制作小部件。
这就是我遇到中介者模式的方式。我写了一些类似这样的东西:
//Extend
Core.extend('widget',function(params){
alert(params.message);
});
//Load it
Core.load('widget',{message:'Hello World'});
//Remove it
Core.remove('widget');
我有 3 个问题:
在这种模式下,您如何/应该使用 JavaScript 处理 DOM 操作?我不希望开发人员在他们的小部件之外弄乱 DOM。
您如何/应该如何处理 AJAX 请求。你应该做点什么吗?您是否应该只在库中提供 AJAX/JSONP 调用(在此示例中为 Core)。
我最大的问题是,您实际上是如何与其他小部件交互的?我不想紧耦合(显然),但我不明白你如何与另一个小部件交互。例如,假设您有一个文本框并在提交时将其发送到数据库。另一个小部件如何称为“时间轴”小部件,现在它已提交,然后使用文本框小部件中的文本更新时间轴?
===UPDATE===
我最后写了这个:
最佳答案
小部件与小部件交互:我几天前刚刚完成构建。我查看了您的实现方式,这里有一些额外的想法供您引用。
您构建的推送系统与 jQuery 的 DOM 事件系统非常相似,因此可以发出和接收任意事件。我一直在使用该系统开发去耦合的小部件,但我发现它非常想要,因为最终“推送”(事件、发出等)脱离了上下文——因为听众不知道这是否在他们审问事件之前,甚至在他们想要的范围内。
例如,假设网页上的每个 UI 元素都是您系统中的一个小部件。一页上很容易就有 30 多个。如果每个人都推送一条“已加载”消息,则其他 29 个必须接收它。此外,正如您提到的,第 3 方开发人员将为该系统开发。然后,这给他们带来了过滤掉他们不想接收的消息的负担。
我在我最新的 widget-communication 系统中采用的方法就是我所说的“pubstring”/“substring”方法(公平地说,我确信其他人已经在我之前提出了这个想法并且已经一些听起来很酷的名字)。基本上,每当一个小部件“推送”时,该推送就会变成一个字符串,其中包含:领域(上下文)、小部件的类型、小部件的特定 ID(无论它是什么)以及特定消息。
例如,假设一个 ID 为 45 的小部件,键入“tweet-list”,在领域“custom”中推送一条消息“loaded”。然后,发布字符串将呈现为:custom.tweet-list.45.loaded。
当放置订阅时,它们是通过哈希表输入的,该哈希表可以选择包含 4 个属性的值(除了我拥有的领域/类型/ID/消息之外,您可以轻松添加更多)。听力会像这样:
listen({ realm: 'custom', type: 'whatever' }, f);//(其中“f”是一个函数)
框架的监听器部分可以将该哈希表转换为一个“子字符串”,它是一个正则表达式,表示它所代表的过滤器:
自定义\.whatever\.[^\.]+\.[^\.]+
该正则表达式作为编译后的正则表达式存储到某个隐藏数组中...
__subscriptions.push(new RegExp(subString));
然后每当推送(即发布)内容时,框架基本上循环遍历 __subscriptions 数组,触发每个存储的子字符串(正则表达式)的 .test 并在匹配时执行该子字符串的回调.
使用这个系统可以应用无限过滤的监听器,并且监听器知道他们只接收他们感兴趣的上下文的通知。
例子:
// Listen for all messages by widget ID #99
listen({ id: 99 } ,f);
// Listen for all messages by widgets in realm clientB
listen({ realm: 'clientB' }, f);
// Listen for the data-received push of widgets whose type is tweet-list
listen({ type: 'tweet-list', message: 'data-received' }, f);
因为正则表达式实际上只是一个串联,所以正则表达式也可以包含在过滤器中。
// Listen for any data- message
listen({ message: 'data-[^\.]+' }, f);
这个系统的美妙之处在于,您仍然可以保留当前的界面以“让事情保持简单”,并且只需为 argument[0] 测试字符串或哈希表。换句话说..
// This
listen('loaded', f);
// Could be equivalent to this on the backend:
listen({ message: 'loaded' }, f);
我知道这很长,但希望它能给你一些想法。
关于javascript - JavaScript 问题中的中介模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6947208/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer