最近我潜入了整个客户端MVC/MVVM设计模式,我特别感兴趣的是backbone.js.
我不完全理解的一件事是当模型不再需要它们时会发生什么.
假设我们有一个拥有用户和产品的应用.我们有用户模型/视图和产品模型/视图
注意:为简单起见,我们不是用户.我们可以只是CRUD用户/产品.
当我进入产品页面时,我假设我们加载模型和对应的视图.
当我们离开页面并进入用户页面时会发生什么.加载了用户模型/视图,但仍然加载了产品.
我们是否保持它们的负载,骨干是否为您处理,或者您是否明确需要结束某些对象.
javascript garbage-collection memory-leaks memory-management backbone.js
编辑:忘了包含我的环境信息... Win7x64,RubyInstaller Ruby v1.9.1-p378
编辑2:刚刚更新到v1.9.1,补丁429,仍然得到同样的错误.
编辑3:在Ruby v1.8.7,补丁249中运行相同的代码,工作正常.所以它的v1.9.1明显打破了它.
我是新手使用ERB,我能找到的样品......嗯......不太有帮助......和ERB玩了大约一个小时,我得到了一些基本的例子(最后),但我有不明白为什么这不起作用......
require 'ostruct'
require 'erb'
data = {:bar => "bar"}
vars = OpenStruct.new(data)
template = "foo "
erb = ERB.new(template)
vars_binding = vars.send(:binding)
puts erb.result(vars_binding)
Run Code Online (Sandbox Code Playgroud)
此代码生成以下错误:
irb(main):007:0> puts erb.result(vars_binding)
NameError: undefined local variable or method `bar' for main:Object
from (erb):1
from C:/Ruby/v1.9.1/lib/ruby/1.9.1/erb.rb:753:in `eval'
from C:/Ruby/v1.9.1/lib/ruby/1.9.1/erb.rb:753:in `result'
from (irb):7
from C:/Ruby/v1.9.1/bin/irb:12:in `'
为什么要看main:Object绑定?我告诉它通过传入来使用OpenStruct的绑定vars_binding
有人可以告诉我为什么它不起作用,并帮助我让它工作?
我有一个小框架,使用内置到ruby中的Logger对象记录一些信息和调试消息.在运行时,这很有效.在单元测试时(如果重要的话,使用rspec ...)我想将记录的消息转储到内存字符串变量中.这样做最简单的方法是什么?
我正在考虑一个替换信息和调试方法的猴子补丁,如下所示:
class Logger
def info msg
$logs = msg
super msg
end
end
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法将我的日志消息发送到字符串变量?
我有一个看似有效的Backbone路由器设置 - 路由被正确触发,视图更新等.但是,当我按下浏览器的"后退"按钮时,根本不会触发路由.此外,在浏览器中键入URL也不会触发路由器.我是否缺少将浏览器特定内容绑定到Backbone(Firefox 11)的步骤.
建立
var messageRouter = new MessageRouter({view: messageListView});
Backbone.history.start();
Run Code Online (Sandbox Code Playgroud)
触发
Backbone.history.navigate("#/view/" + $(this).data("filter-type"), {trigger: true});
Run Code Online (Sandbox Code Playgroud)
路由器代码
var MessageRouter = Backbone.Router.extend({
view : null, /* should always be overridden */
initialize : function(options)
{
this.view = options.view;
},
routes : {
"" : "default",
"/view/:filter" : "filter",
"camera" : "camera"
},
default : function() {
},
filter : function(filterString) {
this.view.setFilter(filterString);
this.view.rerender();
},
camera : function(cameraString) {
}
});
Run Code Online (Sandbox Code Playgroud) 是否有可能为一lambda,proc,method或其他类型的宝石块,以获得到另一个块?
就像是...
a = lambda {
puts 'in a'
yield if block_given?
}
a.call { puts "in a's block" }
Run Code Online (Sandbox Code Playgroud)
这不起作用......它只是产生
in a
=> nil
Run Code Online (Sandbox Code Playgroud)
有没有办法让块调用一个块?
我有这个代码:
Net::SSH.start(@server, @username, :password => @password) do |ssh|
output = ssh.exec!(@command)
@logger.info 'SSH output: '
@logger.info output
end
Run Code Online (Sandbox Code Playgroud)
我可以使用像这样的RSpec模拟框架来模拟SSH.Start,告诉我我已经启动了SSH会话:
Net::SSH.should_receive(:start).with("server", "user", :password => "secret") do
@started = true
end
这告诉我是否@started ssh会话.现在我需要模拟ssh.exec!方法,这很容易:
Net::SSH.should_receive(:exec!).with("command")...Run Code Online (Sandbox Code Playgroud)
但是如何产生/调用包含ssh.exec的块呢!方法调用,因为我已经模拟了SSH.start方法?我可以调用一些简单的方法来执行这个块,但是我不知道它是什么,也找不到任何关于rspec模拟框架的真正好的解释/文档.
我有一个小的但不断增长的框架,用于构建带有ruby/rake的.net系统,我已经有一段时间了.在此代码库中,我有以下内容:
require 'rake/tasklib'
def assemblyinfo(name=:assemblyinfo, *args, &block)
Albacore::AssemblyInfoTask.new(name, *args, &block)
end
module Albacore
class AssemblyInfoTask < Albacore::AlbacoreTask
def execute(name)
asm = AssemblyInfo.new
asm.load_config_by_task_name(name)
call_task_block(asm)
asm.write
fail if asm.failed
end
end
end
Run Code Online (Sandbox Code Playgroud)
该代码遵循的模式在框架中重复约20次.每个版本的不同之处在于正在创建/调用的类的名称(而不是AssemblyInfoTask,它可能是MSBuildTask或NUnitTask),以及execute方法的内容.每个任务都有自己的执行方法实现.
我不断修复这种代码模式中的错误,每次需要修复时我都要重复修复20次.
我知道可以做一些元编程魔术,并从一个位置为我的每个任务连接这个代码......但是我很难让它运行起来.
我的想法是我希望能够调用这样的东西:
create_task :assemblyinfo do |name|
asm = AssemblyInfo.new
asm.load_config_by_task_name(name)
call_task_block(asm)
asm.write
fail if asm.failed
end
Run Code Online (Sandbox Code Playgroud)
这将连接我需要的一切.
我需要帮助!提示,建议,有人愿意解决这个问题......我如何避免不得不一遍又一遍地重复这种代码模式?
更新:你可以在这里获得完整的源代码:http://github.com/derickbailey/Albacore/提供的代码是/lib/rake/assemblyinfotask.rb
编辑:修复了几个语法和一致性问题,使代码更加明显,接近我实际做的事情.
我有一些看起来像这样的代码:
SomeClass someClass;
var finalResult =
DoSomething(() =>
{
var result = SomeThingHappensHere();
someClass = result.Data;
return result;
})
.DoSomething(() => return SomeOtherThingHappensHere(someClass))
.DoSomething(() => return AndYetAnotherThing())
.DoSomething(() => return AndOneMoreThing(someClass))
.Result;
HandleTheFinalResultHere(finalResult);
Run Code Online (Sandbox Code Playgroud)
其中DoSomething方法是扩展方法,并且它期望传递给它的Func.因此,每个DoSomething => lambda中的每个方法调用都返回一个Result类型.
这类似于一个可能的monad.除了检查空值,我检查Result类的状态,并调用传递给DoSomething的Func或返回前一个Result而不调用Func
我面临的问题是希望在我的代码中使用这种组合,但我还需要能够将一个组合调用结果中的数据传递给另一个调用结果,正如您可以看到的那样someClass.
我的问题不是这在技术上是否正确......我知道这是有效的,因为我现在正在这样做.我的问题是这是否是滥用闭包,命令查询分离或任何其他原则......然后询问有什么更好的模式来处理这种情况,因为我很确定我是现在,这种类型的代码陷入了"闪亮的新锤子"模式.
c# closures anti-patterns principles command-query-separation
我看到它们共享几乎相同的属性和功能,那么这两者的主要区别是什么?
我正在使用Signalr集线器订阅服务器上的事件.什么事件被分派到集线器,它成功地将项目添加到Marionette CollectionView.反过来,这将呈现给一个表.
因为事件表基本上是一个吸墨纸,我希望这些事件的顺序相反,最好只保留n个事件.
Backbone可以"自动"以相反的顺序重新渲染集合吗?
backbone.js ×4
ruby ×4
lambda ×2
marionette ×2
rspec ×2
binding ×1
c# ×1
closures ×1
dry ×1
erb ×1
javascript ×1
logging ×1
memory-leaks ×1
mocking ×1
nameerror ×1
principles ×1