我需要在产品价格发生变化时发送电子邮件提醒.有可能这样做ActiveRecord::Observer或者我是否需要在编辑表单中使用编程逻辑?
我想在执行每个控制器的方法之前调用一个方法.我不想在每种方法中调用该方法.我只是想从一个地方调用它,它将在magento中任何控制器的任何方法之前调用.
我相信我们可以做到这一点,但我不知道如何实现.
请提供您的建议.
希望我们能解决这个问题,或者一些专家已经解决了这个问题.
谢谢.
我正在编写一个简单的注释观察器,无论何时创建新注释,它都会触发邮件程序.所有相关的代码都在这个要点:https://gist.github.com/c3234352b3c4776ce132
请注意,Notification传递的规格,但CommentObserver因为Notification.new_comment返回失败的规格nil.我发现通过使用它可以获得通过规范:
describe CommentObserver do
it "sends a notification mail after a new comment is created" do
Factory(:comment)
ActionMailer::Base.deliveries.should_not be_empty
end
end
Run Code Online (Sandbox Code Playgroud)
然而,这并不理想,因为它在观察者的规范中测试邮件程序的行为,而我真正想知道的是它正在触发邮件程序.为什么邮件程序会返回nil原始版本的规范?选择此类功能的最佳方法是什么?我正在使用Rails 3和RSpec 2(和Factory Girl,如果这很重要).
我有一个IObservable; 其中属性更改具有实体ID和PropertyName.我想用它来更新数据库,但是如果多个属性几乎同时发生变化,我只想对同一个实体的所有属性进行一次更新.
如果这是一个静态IEnumerable并且我使用LINQ我可以简单地使用:
MyList.GroupBy(C=>C.EntityID);
Run Code Online (Sandbox Code Playgroud)
但是,列表永远不会终止(从不调用IObserver.OnComplete).我想要做的是等待一段时间,比如1秒钟,将所有呼叫分组适当的一秒钟.
理想情况下,我会为每个EntityID设置单独的计数器,只要找到该EntityID的新属性更改,它们就会重置.
我不能使用像Throttle这样的东西,因为我想处理所有的属性更改,我只是想一次性处理它们.
我需要保存有关将每封电子邮件发送到我的客户端以进行进一步分析的信息.所以我试图在Observer中做到这一点,但我需要有关发票的信息.所以我有梅勒:
class ClientMailer < ActionMailer::Base
default :from => "no-reply@tori-app.herokuapp.com"
def remind(client, invoices)
@client = client
@company = @client.company
@invoices = invoices.to_a
@template = t('message.template')
@text = liquid_parse @template
@html = markdown_parse @text
mail(:to => @client.email, :subject => t('message.title')) do |format|
format.html
format.text
end
end
private
def markdown_parse(text)
markdown = Redcarpet::Markdown.new Redcarpet::Render::HTML,
:autolink => true, :space_after_headers => true
markdown.render text
end
def liquid_parse(text)
renderer = Liquid::Template.parse text
renderer.render 'company' => @company, 'invoice' => @invoice, 'client' => @client
end
end
Run Code Online (Sandbox Code Playgroud)
问题是:如何传递@invoices …
我可以使用观察者模式进行错误处理吗?它有什么优点/缺点?有人为此目的使用这种方法吗?
更新:
class MyErrorApi{
public static final int NETWORK_ERROR = 1;
public(MyErrorApi error){
...
}
}
interface ErrorListener{
void onErrorOcurred(MyErrorApi arror)
}
class MyBaseScreen implements ErrorListener{
void onErrorOcurred(MyErrorApi arror){
swirch(arror){
**showPopup();**
.....
}
}
Run Code Online (Sandbox Code Playgroud) 我想影响产品渲染(传递$params给Mage_Catalog_Helper_Product_View::prepareAndRender())并在controller_action_predispatch_catalog_product_view事件上注册观察者.
渲染工作正常,但原始catalog/product/view操作仍然执行,因此显示两个产品.
如何在预派遣观察员期间停止调度?
我编写了一个简单的观察者模式,其中观察者具有"void notify(std :: string)"函数,并且可观察对象在每个注册的观察者上调用它,并使用标记化的字符串来传输数据.这非常简单,容易且有效,但我需要前进一步.
我需要用信号和插槽来实现它(例如使用boost :: signals2).但是我不知道插槽和信号应该是什么样子以及它们应该如何放置.我也不知道如何允许注册我想要的任何功能,而不仅仅是void(字符串).
我找不到任何使用信号和插槽的好资源.然而每个人都说信号和插槽对于观察者模式来说是惊人的.你能指导我如何将信号和插槽用于观察者模式吗?
我目前没有信号的实现如下:
class observable
{
public:
void register(observer *);
void unregister(observer *);
protected:
void notifyObservers()
{
for every registered observer
observer.notify(std::string tokenized_string);
}
}
class observer
{
public:
void notify(std::string) = 0;
}
Run Code Online (Sandbox Code Playgroud)
我需要更改此模式以使用信号和插槽,但我不知道它应该如何有用,设计良好且灵活.
我正在努力在为作业提供的代码上实现可观察设计模式。我不想要完整的答案,但我确实想了解缺少的内容。我不会复制所有代码,但是到目前为止,我已经编写了相关的代码。该代码是一个简单的银行GUI,允许我们将储蓄和支票帐户保存到ArrayList。我的第一步是将其拉到新对象AccountList中,并像这样扩展Observable:
public class AccountList extends Observable {
public List<AAccount> accountList;
public AccountList(List<AAccount> accountList) {
this.accountList = accountList;
}
public void add(AAccount acc) {
accountList.add(acc);
hasChanged();
notifyObservers();
}
}
Run Code Online (Sandbox Code Playgroud)
我的下一步是这样实现一个观察者类:
public class AccountListObserver implements Observer{
public AccountListObserver(Observable o) {
o.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Account " + o + " has been added, " +
"there are now " + o + " accounts on the server.");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在实际的Server类中,一开始我要指出以下内容:
AccountList accList = new AccountList(new ArrayList<AAccount>()); …Run Code Online (Sandbox Code Playgroud) 我创建了一个vue对象来进行数据反应:
let vm = new Vue({
data () {
return {
myData: {}
}
},
watch: {
myData (value) {
console.log('changed')
}
}
})
Run Code Online (Sandbox Code Playgroud)
当我将/推入/编辑/删除到时vm.myData,一切正常,监视者将其发送给我changed。
现在,我只想通过“触摸”(没有数据版本)来获取changed事件。我可以为此调用观察者的内部方法吗? vm.myData
observer-pattern ×10
actionmailer ×2
java ×2
magento ×2
observable ×2
activerecord ×1
c# ×1
c++ ×1
controller ×1
dispatch ×1
events ×1
linq ×1
php ×1
rspec ×1
signals ×1
vue.js ×1