标签: observer-pattern

Magento在观察者中重新计算购物车总数

我有一个观察员,如果他们缺货就会从购物车中移除物品(即顾客返回购物车的时间x,购物车中的商品已经缺货),并向用户显示消息.

删除项目有效,但更新购物车总数不会. 任何帮助将非常感激!

我的观察者观察sales_quote_save_before事件:

public function checkStockStatus($observer)
{
    // return if disabled or observer already executed on this request
    if (!Mage::helper('stockcheck')->isEnabled() || Mage::registry('stockcheck_observer_executed')) {
        return $this;
    }

    $quote = $observer->getEvent()->getQuote();
    $outOfStockCount = 0;

    foreach ($quote->getAllItems() as $item) {
        $product = Mage::getModel('catalog/product')->load($item->getProductId());
        $stockItem = $product->getStockItem();
        if ($stockItem->getIsInStock()) {
            // in stock - for testing only
            $this->_getSession()->addSuccess(Mage::helper('stockcheck')->__('in stock'));
            $item->setData('calculation_price', null);
            $item->setData('original_price', null);
        }
        else {
            //remove item 
            $this->_getCart()->removeItem($item->getId());
            $outOfStockCount++; 
            $this->_getSession()->addError(Mage::helper('stockcheck')->__('Out of Stock'));
        }
    }

    if ($outOfStockCount) > 0) {       
        $quote->setTotalsCollectedFlag(false)->collectTotals();
    } 

    Mage::register('stockcheck_observer_executed', …
Run Code Online (Sandbox Code Playgroud)

session magento cart observer-pattern

11
推荐指数
2
解决办法
3万
查看次数

在Rails中,扫描程序不会在仅模型设置中调用

我正在开发一个Rails应用程序,我正在使用页面缓存来存储静态html输出.缓存工作正常.但是,我无法使缓存过期.

我相信我的问题部分是因为我没有从控制器到缓存.所有必要的操作都在模型中处理.这看起来应该是可行的,但我发现的所有对基于模型的缓存过期的引用似乎已经过时,或者在其他方面都不起作用.

在我的environment.rb文件中,我正在调用

config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
Run Code Online (Sandbox Code Playgroud)

我在/ sweepers文件夹中有一个LinkSweeper文件:

class LinkSweeper < ActionController::Caching::Sweeper
  observe Link

  def after_update(link)
    clear_links_cache(link)
  end

  def clear_links_cache(link)
  # expire_page :controller => 'links', :action => 'show', :md5 => link.md5
    expire_page '/l/'+ link.md5 + '.html'
  end
end
Run Code Online (Sandbox Code Playgroud)

那么...... 为什么在更新模型时不删除缓存页面?(进程:使用脚本/控制台,我从数据库中选择项目并保存它们,但是它们的相应页面没有从缓存中删除),我也在调用通常会调用的链接模型中的特定方法扫地机.两者都不起作用.

如果重要,则缓存文件是Links表中键值的md5哈希值.缓存页面存储为/l/45ed4aade64d427...99919cba2bd90f.html.

从本质上讲,似乎扫地机实际上并没有观察到链路.我还读到(这里)可能只是简单地将sweeper添加到environment.rb中的config.active_record.observers,但这似乎没有做到(我不确定app/sweepers的load_path)在environment.rb中避免了).

model ruby-on-rails sweeper observer-pattern

10
推荐指数
2
解决办法
6189
查看次数

RSpec发送电子邮件(不存储在ActionMailer :: Base.deliveries中) - 不知道为什么?

我使用rspec,当我运行rake规范时,用户邮件程序通过smtp发送电子邮件,而不是将电子邮件存储在ActionMailer :: Base.deliveries-array中(由用户观察者调用)...

你能给我一个提示吗?

# Rails version
rails -v
=> Rails 3.0.1

# Ruby version with rvm (rvm version 1.0.16)
ruby -v
=> ruby 1.9.2p7 (2010-09-29 revision 29373) [x86_64-darwin10.4.0]

# Gemfile
gem "rspec-rails", ">= 2.0.1"
Run Code Online (Sandbox Code Playgroud)

配置-文件:

# config/environments/test.rb
MyApp::Application.configure do
  config.action_mailer.delivery_method = :test
  config.action_mailer.raise_delivery_errors = true
end

# spec/spec_helper.rb
...
ENV["RAILS_ENV"] ||= 'test'
...

# app/models/user_observer.rb
class UserObserver < ActiveRecord::Observer
  observe User

  def after_create(record)
    puts Rails.env
    # => "test"
    UserMailer.new_user_notification(record).deliver
    puts ActionMailer::Base.deliveries.inspect
    # => []
    # Sends it via smtp! …
Run Code Online (Sandbox Code Playgroud)

email rspec ruby-on-rails observer-pattern ruby-on-rails-3

10
推荐指数
2
解决办法
3284
查看次数

10
推荐指数
2
解决办法
2302
查看次数

使用rails观察器跟踪字段更改

我试图找出一种方法来记录有人更新对象时的更改.现在我的观察者将存储所有当前值,但我对如何确定哪些字段已更改以及如何将它们存储在我的feed db中感到迷茫.

为简单起见,这里有一个样本模型和观察者.我的目标是跟踪更新的字段并将其存储在Feed数据库中.如果需要,我愿意在我的数据库中添加新字段.如果您有任何疑问,请告诉我.

模型

# Table name: milestones
#
#  id            :integer         not null, primary key
#  name          :string(255)
#  project_id    :integer
#  target_date   :datetime
Run Code Online (Sandbox Code Playgroud)

观察者跟踪变化

class MilestoneObserver < ActiveRecord::Observer

    def after_update(milestone)
        f = Feed.new(
          :action => milestone.name, 
          :project_id => milestone.project_id, 
          :updated_by_id => "Jordan")
        f.save
    end 
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails observer-pattern

10
推荐指数
1
解决办法
3198
查看次数

Clojure模型 - 视图 - 控制器(MVC)设计

我正在使用Java Swing在Clojure中编写一个桌面GUI应用程序.通常在使用Java时,我将使用Observer模式根据MVC设计模式设计应用程序.通过这种方式,视图与模型分离,并且其中的任何一个中的更改都不会相互影响,从而使更改变得更加容易.

我想知道Clojure是否比普通的MVC和Observer设计模式更好地解决了这个问题?我是函数式编程的新手,所以我不确定如何将模型与视图分开.我需要这个,因为应用程序将迭代开发,并且可能存在更具挑战性的要求.

非常感谢任何帮助.

谢谢,

亚当

model-view-controller design-patterns functional-programming clojure observer-pattern

10
推荐指数
2
解决办法
3909
查看次数

如何一个接一个地组合两个实时数据?

我有下一个用例:用户登录表格,输入姓名,电子邮件和密码,点击注册按钮.之后系统需要检查电子邮件是否被采用并基于该显示错误消息或创建新用户...

我试图使用Room,ViewModel和LiveData来做到这一点.这是我尝试学习这些组件的一些项目,我没有远程api,我会将所有内容存储在本地数据库中

所以我有这些课程:

  • RegisterActivity
  • RegisterViewModel
  • 用户
  • UsersDAO
  • UsersRepository
  • UsersRegistrationService

所以我的想法是将有一个监听器附加到注册按钮,它将调用RegisterViewModel::register()方法.

class RegisterViewModel extends ViewModel {

    //...

    public void register() {
        validationErrorMessage.setValue(null);
        if(!validateInput())
            return;
        registrationService.performRegistration(name.get(), email.get(), password.get());
    }

    //...

}
Run Code Online (Sandbox Code Playgroud)

所以这是基本的想法,我也想performRegistration回到我新建的用户.

最困扰我的是我不知道如何performRegistration在服务中实现功能

class UsersRegistrationService {
    private UsersRepository usersRepo;

    //...

    public LiveData<RegistrationResponse<Parent>>  performRegistration(String name, String email, String password) {
         // 1. check if email exists using repository
         // 2. if user exists return RegistrationResponse.error("Email is taken") 
         // 3. if user does not exists create new user …
Run Code Online (Sandbox Code Playgroud)

android observer-pattern android-room android-livedata android-architecture-components

10
推荐指数
7
解决办法
6477
查看次数

如何在 React 应用程序中处理 Firebase onAuthStateChanged 并相应地路由用户?

我正在开发一个与 Firebase 集成的 React Web 应用程序,并且我正在尝试对我的用户进行身份验证。我已经设置了路线,以便在用户通过身份验证时显示主页组件,否则显示登录页面。但是,当我的应用程序首次加载时,它会显示登录页面,需要一两秒的时间才能识别用户实际上已通过身份验证,然后切换到主页。它看起来很混乱,我猜我没有很好地或足够快地处理 onAuthStateChanged 。在我的 App 组件中,我订阅了一个 ReactObserver,它会在身份验证状态发生更改时发出信号。我该怎么做才能避免这种奇怪的行为?

我的App.js

import {BrowserRouter, Route} from "react-router-dom";
import Home from "./Home";
import Login from "./Login";
import {loggedIn, firebaseObserver} from "../firebase";
import {useEffect, useState} from "react";

export default function App() {
    const [authenticated, setAuthenticated] = useState(loggedIn())

    useEffect(() => {
        firebaseObserver.subscribe('authStateChanged', data => {
            setAuthenticated(data);
        });
        return () => { firebaseObserver.unsubscribe('authStateChanged'); }
    }, []);

   return <BrowserRouter>
             <Route exact path="/" render={() => (authenticated ? <Home/> : <Login/>)} />
          </BrowserRouter>;
}
Run Code Online (Sandbox Code Playgroud)

我的 …

authentication observer-pattern firebase reactjs react-router-dom

10
推荐指数
1
解决办法
1万
查看次数

java.util.Observable是线程安全的吗?

在java的Observer模式类ObserverObservable中,调用Observable对象的notifyObservers(Object arg0),在不同的线程中,线程安全吗?

示例:我有多个线程,所有Observable,将经常调用notifyObservers(...).所有这些线程都报告给一个Observer对象.

我是否会遇到并发问题,以及解决这个问题的更好方法是什么?我知道使用事件侦听器的可能解决方案.但是我不确定如何实现它,如果可能的话,我想坚持使用Observer模式实现.

java thread-safety observer-pattern

9
推荐指数
1
解决办法
6786
查看次数

观察者在购物车中删除了物品

是否有观察员可以用来观察产品从购物车中取出时的事件?我还没找到.

我发现checkout_cart_update_items_after如果通过改变产品数量来移除产品,可以使用哪些产品,但是当用户使用移除按钮时则不能使用.我现在看到的唯一选择checkout_cart_save_after是每当推车改变时使用.当然,这需要定制逻辑来检查哪个产品被删除.不完美.

那么是否有更好的方法来注意删除事件?

magento observer-pattern

9
推荐指数
1
解决办法
7655
查看次数