小编Emr*_*oin的帖子

在 Apollo Client 3 中合并非规范化数据时出现“缓存数据可能丢失”警告

我正在将使用 Apollo Client 的应用程序从 v2 升级到 v3,但找不到以下问题的正确解决方案。

我有一个产品的架构,在这个产品中,有一个价格。这个价格不是一个简单的数字,因为它包含免税价值、所有税金包括价值和增值税。

type Product {
   id: ID
   price: Price
}

type Price {
   dutyFree: Float
   allTaxesIncluded: Float
   VAT: Float
}
Run Code Online (Sandbox Code Playgroud)

在 Apollo Client 2 中,只要没有明确的 id 或 _id 属性,InMemoryCache 就会根据对象的路径创建回退假标识符来规范数据。

在 Apollo Client 3 中,不再生成此后备假标识符。相反,您有两种选择来处理非规范化数据。第一个是使用新的 TypePolicy 选项并明确指示您收到的数据不应标准化。在这种情况下,数据将链接到父规范化数据。

文档:

未规范化的对象会嵌入到缓存中的父对象中。您不能直接访问这些对象,但可以通过它们的父对象访问它们。

new InMemoryCache({
   typePolicies: {
      Price {
         keyFields: false
      }
   }
})
Run Code Online (Sandbox Code Playgroud)

都很开心,虽然我的问题解决了。好吧,错了......我可以在我的应用程序中创建一个产品并添加一个价格。但是,每当我更改现有价格时,都会收到以下警告:

替换 Product 对象的 price 字段时,缓存数据可能会丢失。

因为,当我在更新后获取我的 Product 时,InMemoryCache 不知道如何合并字段 Price 因为没有定义 id,这是非规范化数据的点。

我知道有第二个选项可以为我的 Product.price 字段显式定义合并函数,但这个例子是现实的一个更简单的版本。我通过多个类型为 Price 的对象有大量字段,并且为每个对象手动定义一个合并函数(即使通过外部化函数中的公共逻辑)是我发现效率非常低和错误的来源。

所以我的问题是:我对这个keyFields: false选项有什么误解,我可以做些什么来解决这个问题,而不必求助于在我的应用程序中为 50 多个字段定义合并函数? …

apollo apollo-client

7
推荐指数
1
解决办法
852
查看次数

TypeScript 对 Javascript 源使用 noImplicitAny

我想noImplicitAny在我的编译器中启用该标志。我的问题是我使用 lodash/fp 并且到目前为止还没有打字。

因此编译器抱怨缺少 lodash/fp 的定义文件。

有没有办法只允许外部js文件使用隐式any?或者将子目录列入白名单,例如node_modules

javascript typescript typescript-typings

5
推荐指数
1
解决办法
1836
查看次数

无法删除chrome中的内联事件处理程序

我想删除一个包含onsubmit内联定义的表单的事件处理程序.

<form id="loginForm" onsubmit="return performTask(this);">
Run Code Online (Sandbox Code Playgroud)

我已经尝试过:

$("#loginForm").off("submit")
$("#loginForm").unbind("submit")
$("#loginForm").die("submit")
$("#loginForm").removeAttr("onsubmit")
$("#loginForm").removeProp("onsubmit")
$("#loginForm").attr("onsubmit", "")
$("#loginForm").prop("onsubmit, "")
$("#loginForm")[0].onsubmit = null
$("#loginForm")[0].onsubmit = undefined
$("#loginForm")[0].onSubmit = null
$("#loginForm")[0].onSubmit = undefined
Run Code Online (Sandbox Code Playgroud)

什么都行不通!

我在j()的jquery方法中添加了我自己的事件监听器,但它永远不会被调用.它是旧的事件监听器在我之前执行的...它与按钮上的onClick事件做同样的事情.

我必须明确表示我正在使用chrome扩展,更确切地说是在页面中注入的内容脚本中.

所以问题是,有没有办法清除事件处理程序?或者更好的是有没有办法添加一个将在内联处理程序之前调用的事件监听器?

编辑:经过许多丑陋的代码,我找到了一种方法来做我想要的...我做了一个表单的副本,删除内联envent处理程序,在我的dom旧表单中替换然后创建我的事件处理程序.这很难看,但它有效...如果有人能解释为什么我不能这样做...

javascript jquery events google-chrome google-chrome-extension

2
推荐指数
1
解决办法
937
查看次数

如何在Webstorm中的整个目录上触发文件观察程序

我正在使用Webstorm文件观察器来编译我的CoffeeScript.

我的问题是我重构了项目文件的结构.

我可以删除/ bin目录中的所有文件,并告诉webstorm在目录中的所有.coffee文件上应用他的文件观察器编译命令吗?因为我不想打开,修改和重做修改每个文件只是为了获取编译的javascrit ...

intellij-idea coffeescript webstorm file-watcher

2
推荐指数
1
解决办法
2016
查看次数

是否可以在Play框架中使用frege

我正在搜索一个新项目的语言.这是基于Web的项目,我想采用REST架构.

我还想要一种函数编程语言.我可以选择Haskell(因为它很酷)和Scala(因为Play Framework).

经过一些研究发现它与语言之间的主要区别后,我找到了Frege,一种在JVM上运行的类似Haskell的语言.

所以我的问题是,因为Frege在JVM上运行,是否可以将Play框架与Frege一起使用?

java jvm scala playframework frege

2
推荐指数
1
解决办法
593
查看次数

ES6导入“模块”不提供对“模块”功能的访问

我正在尝试将 ES6 imorts 与 babel 和 Node.js 一起使用

import "./utils.js";

log("something"); //throw an error : log is not defined
Run Code Online (Sandbox Code Playgroud)

我的utils.js样子是这样的:

function log(... params){
    console.log(... params);
}

log("module utils executed");
//Is executed and display "module utils executed" in the console.
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用export function log(... params)andexport default log(... params)但它不起作用。

所以我不明白这是如何运作的......

编辑:

我知道另一种导入方式是import utils from "./utils.js"

但这不是我想要的。我希望能够使用log()而不用模块变量名作为前缀。就像这篇博文一样

javascript import node.js ecmascript-6

0
推荐指数
1
解决办法
4859
查看次数