0

「customerLoaded」アクションをリッスンしている Reflux ストアがあります。このアクションにより、顧客の詳細が店舗に提供されます。ストアが新規または更新された顧客情報を受信すると、リッスン コンポーネントに新規または更新された顧客の詳細を通知するようトリガーされます。

(すべてのコードはオランダ語から英語に翻訳されているため、1 つまたは 2 つのタイプミスがある可能性があります)

var CustomerStore = Reflux.createStore({
init: function ()
{
    this.listenTo(CustomerActions.customerLoaded, this._onCustomerLoaded);
},
// handlers
_onCustomerLoaded: function (data)
{
    if (data)
    {
        _customers[data.Number] = data;
        this.trigger(data.Number);
    }
},
getCustomer: function(number)
{
  var customer = null;
  if(_customers[number])
  {
    customer = _customers[number];
  }
  else
  {
    CustomerActions.loadCustomer(number);
  }
  return customer;
}
});

そして、逆流アクションがあります。

var CustomerActions = Reflux.createActions(
[
  "loadCustomer",
  "customerLoaded",
  "setEmail",
]
);

CustomerActions.loadCustomer.preEmit = function (number)
{
    if (!number|| number=== 0 || number=== '')
    {
        CustomerActions.customerLoaded(null);
    }
    else
    {
      // request details from server
      CustomerApi.getCustomerByNumber(number)
        .done(function (data)
          {
              // send details to the store
              CustomerActions.customerLoaded(data);
           }
        );
    }
};

CustomerActions.setEmail.preEmit = function (number, newValue)
{
  if(number && number !== 0 && number !== '')
  {
    // send updated email address to server
    CustomerApi.setEmail(number, newValue)
      .done(function (result)
      {
        if(result)
        {
          // start action to load customer details from the server
          CustomerActions.loadCustomer(number);
        }
        // else.. TODO: ...
      });
      }
    };

この問題は、setEmail アクションが使用されているときに発生します。実際、このアクションは正常に機能し、メール アドレスはサーバー上で更新されます。サーバーから顧客の詳細をリロードするアクションもトリガーされますが、loadCustomer.preEmit では、「CustomerActions.customerLoaded(data)」アクションがトリガーされても何も起こりません。CustomerStore はこのアクションに応答しません。'data' パラメータには期待どおりのデータが含まれているため、これは問題ではありません。

最も奇妙なことは、最初に顧客の詳細を画面に表示するために、CustomerActions.loadCustomer と CustomerStore の同じ組み合わせが問題なく使用されることです。この組み合わせは、別の顧客の詳細を表示するために使用する場合にも機能します。

何が問題なのか、またはストアがアクションに応答しない理由を確認するために何ができるかについての手がかりを誰かが持っていますか?

前もって感謝します!

4

2 に答える 2

2

preEmit フックを使用する代わりに、非同期ワークフローの例を使用してコードを書き直してみてください。検証が必要な場合は、preEmit の代わりに shouldEmit フックを使用する必要があると思います。ただし、最初はフックなしで試してください。 https://github.com/spoike/refluxjs#asynchronous-actions

多分これが役立つでしょう。

于 2015-04-28T09:03:45.453 に答える