我正在构建一个自定义的ReactJS组件(一个'Select2'下拉列表包装器),并希望使用'valueLink'参数实现对标准双向绑定帮助程序的支持.
但是,似乎处理'valueLink'参数的mixin仅适用于标准组件,而不适用于自定义组件.
有没有办法让我的组件自动实现标准的valueLink行为,或者我是否需要自己显式解析和实现此支持(可能会引入基本库中不存在的错误或奇怪的行为)
假设我有一个类型 Person
import GHC.Generics
import Data.Text
import Data.Aeson
import Control.Lens
data Person = Person {
_firstName :: Text,
_lastName :: Text,
_age :: Int
} deriving (Show, Generic)
Run Code Online (Sandbox Code Playgroud)
我想自动为它导出镜头和JSON类型类
makeLenses ''Person
instance FromJSON Person
instance ToJSON Person
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是DeriveGeneric将我的字段名称视为具有下划线并且期望我的JSON相应地格式化.
{ "_firstName": "James" ... etc} -- The underscore doesn't belong here.
Run Code Online (Sandbox Code Playgroud)
显然我可以从data
定义本身中删除下划线,但是后来makeLenses
无法派生所需的getter和setter.
理想情况下,我希望能够做到的是这样的事情
let person = decode blob
let name = person ^. firstName
Run Code Online (Sandbox Code Playgroud)
即我希望能够导出镜头和JSON实例,所有字段名称都正确排列在我正在消耗的JSON-REST Api中的值,而无需编写太多样板文件.
这似乎是一件很直接的事情,我觉得我错过了一些明显的东西?
我正在开发一个允许开发人员上传自定义groovy脚本和freemarker模板的系统.
我可以使用默认的Java安全基础架构在非常高的级别上提供一定级别的安全性 - 即阻止代码访问文件系统或网络,但是我需要限制对特定方法的访问.
我的计划是修改Groovy和Freemarker运行时以读取将某些方法列入白名单或将其列入黑名单的注释,但这会迫使我维护其代码的分叉版本,这是不可取的.
我基本上需要做的就是在从Groovy或Freemarker调用时阻止特定方法的执行.我已经考虑过一个可以查看调用堆栈的黑客,但这将是一个巨大的速度命中(并且它非常混乱).
有没有人有任何其他想法来实现这个?
我已经看过几个使用Generics符号"That"的代码示例.即
def map[B, That](f : (A) => B) : That
Run Code Online (Sandbox Code Playgroud)
但是,由于缺乏谷歌这个词的能力,我找不到任何关于它做什么或如何使用它的文档.
它只是一个普通的类型占位符,还是它做了一些特别的事情?
是否可以从优化的RequireJS/r.js包中导入单个模块?
我有一个javascript项目分为两个独立的组件 - 'MyLibrary'和'MyApplication'
MyLibrary包含两个独立的模块,'MyModule1'和'MyModule2'.
在开发模式中,我可以使用RequireJS导入每个模块,并使用MyApplication中的普通定义(['MyLibrary/MyModule1'],function(){})语法.
但是,一旦通过r.js运行MyLibrary,这似乎不再可能 - 似乎没有办法直接引用内部模块了?
我可以从编译/优化的源中看到每个模块都有define()块,但My Application中的RequireJS似乎不能直接引用它们.
这是可能的,还是我需要将整个应用程序捆绑到一个文件中才能使用.
编辑:我正在Play框架中完成RequireJS优化阶段,并且我对构建配置的控制很少.
({appDir: "javascripts",
[info] baseUrl: ".",
[info] dir:"javascripts-min", mainConfigFile: "javascripts/build.js", modules: [{name: "main"}]})
Run Code Online (Sandbox Code Playgroud) 使用Postgres,我可以执行更新语句并返回受推荐影响的行.
UPDATE accounts
SET status = merge_accounts.status,
field1 = merge_accounts.field1,
field2 = merge_accounts.field2,
etc.
FROM merge_accounts WHERE merge_accounts.uid =accounts.uid
RETURNING accounts.*
Run Code Online (Sandbox Code Playgroud)
这将为我提供与该WHERE
子句匹配的所有记录的列表,但是不会告诉我操作实际更新了哪些行.
在这个简化的用例中,当然简单地添加另一个防护是微不足道的AND status != 'Closed
,但是我的真实世界用例涉及从10,000个行的合并表中更新潜在的几十个字段,我希望能够检测哪些行实际上已经改变了,它们与之前的版本相同.(期望很少的行实际上会改变).
到目前为止我得到的最好的是
UPDATE accounts
SET x=..., y=...
FROM accounts as old WHERE old.uid = accounts.uid
FROM merge_accounts WHERE merge_accounts.uid = accounts.uid
RETURNING accounts, old
Run Code Online (Sandbox Code Playgroud)
这将返回一个新旧行的元组,然后可以在我的Java代码库本身内部进行区分 - 但这需要大量额外的网络流量并且可能容易出错.
理想的情况是能够让postgres返回实际有任何值更改的行 - 这可能吗?
在github上这是一个更真实的例子,我正在做的事情,结合到目前为止的一些建议.
使用Postgres 9.1,但如果需要可以使用9.4.要求是有效的
由于这个问题已经打开,我现在已经完成了大部分工作,虽然我不确定我的方法是否是一个好主意 - 它有点被黑客攻击.
我在Angular项目中有一些代码,它们使用两个具有隔离范围的独立指令.它们不需要共享范围,只需存在于同一元素上.它们都以稍微不同的方式改变DOM,并且重要的是绑定到作为参数传递的值.
这在1.0中工作,但是Angular 1.2现在在尝试执行此操作时会生成错误
要求新/隔离范围的多个指令
基于项目git历史出现Angular 1.2更改行为,以保持同一元素上的两个隔离指令分开.这是一件好事,当在同一元素上放置两个"Attribute"指令时,它可以正常工作.
即
<div my:directive="myDirectiveData" my:other-directive="myOtherDirectiveData" />
Run Code Online (Sandbox Code Playgroud)
像你期望的那样工作.
然而
<my:directive my:directive-data="myDirectiveData" my:other-directive="myOtherDirectiveData" />
Run Code Online (Sandbox Code Playgroud)
引发上述错误.(多个指令要求新/隔离范围)
在这种情况下,我希望每个指令仍然与它们自己的非共享隔离范围并行存在.
这在Angular 1.2中仍然可行吗?
我目前正在将一些代码从传统的Scala移植到Scalaz风格.
在我的大多数代码中,在我公开的API签名中使用Seq特征而不是直接使用具体类型(即List,Vector)是相当常见的.但是,这给Scalaz带来了一些问题,因为它没有提供Bind [Seq]类型类的实现.
即这将正常工作.
List(1,2,3,4) >>= bindOperation
Run Code Online (Sandbox Code Playgroud)
但这不会
Seq(1,2,3,4) >>= bindOperation
Run Code Online (Sandbox Code Playgroud)
失败了 could not find implicit value for parameter F0: scalaz.Bind[Seq]
我认为这是Scalaz中的故意设计决定 - 但我不确定如何在之前的预期/最佳实践.
我是否应该将代码直接写入List/Vector而不是使用更灵活的Seq接口?或者我应该简单地定义我自己的Bind [Seq]类型类?
I'm attempting to write some code that tracks changes to a record and applies them at a later date. In a dynamic language I'd do this by simply keeping a log of List[(String, Any)] pairs, and then simply applying these as an update to the original record when I finally decide to commit the changes.
I need to be able to introspect over the updates, so a list of update functions isn't appropriate.
In Scala this is fairly trivial using …
(很久以前的问题.简化tl;底部是博士).
我有两个使用SBT构建的ScalaJS项目 - "myapp"和"mylib",在以下目录结构中
root/build.sbt
root/myapp/build.sbt
root/myapp/jvm/
root/myapp/js/
root/myapp/shared/
root/mylib/build.sbt
root/mylib/jvm
root/mylib/js
root/mylib/shared
Run Code Online (Sandbox Code Playgroud)
lib
导出名为"com.example:mylib:0.1"的工件,该工件用作库依赖项myapp
.
myapp和mylib位于不同的存储库中,包含自己的构建文件,并且应该能够完全单独构建(即它们必须包含自己的构建配置).
在生产中,它们将单独构建,mylib
首先作为maven工件发布,然后myapp
单独构建.
然而,在开发中,我希望能够将它们合并到父SBT项目中,以便两者可以并行开发,而无需publishLocal
在每次更改后使用.
在传统(不是scalajs)项目中,这将非常容易
$ROOT/build.sbt:
lazy val mylib = project
lazy val myapp = project.dependsOn(mylib)
Run Code Online (Sandbox Code Playgroud)
然而,在ScalaJS,我们实际上有两个项目每个模块里面- ,,appJVM
和.因此,上述配置仅查找聚合根项目,并且未将配置正确应用于实际的JVM和JS项目.appJS
libJVM
libJS
dependsOn
(即myapp和mylib build.sbt每个包含两个项目,以及一个聚合根项目)
理想情况下,我希望能够做类似以下的事情
lazy val mylibJVM = project
lazy val myappJVM = project.dependsOn(mylibJVM)
lazy val mylibJS = project
lazy val myappJS = project.dependsOn(myappJS)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只是在根目录中创建新项目而不是自己导入子项目.
我也尝试了各种路径组合(例如)
lazy val mylibJVM = project.in(file("mylib/jvm"))
Run Code Online (Sandbox Code Playgroud)
但是这没有看到build.sbt文件中的配置 mylib
最终我继续遇到同样的问题 - …
在OO世界中,我有一个类(我们称之为"Suggestor"),它实现接近"策略模式"的东西,以在运行时提供不同的算法实现.作为学习Haskell的练习,我想重写一下.
实际的用例非常复杂,所以我将简单介绍一个简单的例子.
假设我有一个Suggester
列出规则列表的类,并将每个规则作为过滤器应用于数据库结果列表.
每个规则都有三个阶段"构建查询","后查询过滤器"和"记分器".我们最终会得到满足以下要求的界面
buildQuery :: Query -> Query
postQueryFilter :: [Record] -> [Record]
scorer :: [Record] -> [(Record, Int)]
Run Code Online (Sandbox Code Playgroud)
Suggestor需要获取与此接口匹配的规则列表 - 在运行时动态 - 然后按顺序执行它们.必须首先在所有规则中运行buildQuery(),然后是postQueryFilter,然后是scorer.(即我不能只将一个规则的函数组合成一个函数).
在斯卡拉我只是做
// No state, so a singleton `object` instead of a class is ok
object Rule1 extends Rule {
def buildQuery ...
def postQueryFilter ...
def scorer ...
}
object Rule2 extends Rule { .... }
Run Code Online (Sandbox Code Playgroud)
然后可以通过传递相关规则来初始化服务(在运行时根据用户输入定义).
val suggester = new Suggester( List(Rule1, Rule2, Rule3) );
Run Code Online (Sandbox Code Playgroud)
如果规则是单个函数,那么这很简单 - 只需传递一个函数列表.但是,由于每个规则实际上是三个函数,我需要以某种方式将它们组合在一起,所以我有多个实现会议接口.
我的第一个想法是类型类,但是这些似乎不能满足我的需求 - 他们期望一个类型变量,并强制我的每个方法必须使用它 - …
在Scala中使用存在类型时,编译器似乎将存在主体的每个用法推断为不同的类型参数,即使它们实际上是相同的.
对于一个简单的人为例子 - 给出以下代码
class Box[T](value:T){
def get:T = value
def contains(check:T):Boolean = value == check
}
Run Code Online (Sandbox Code Playgroud)
我可以做以下事情
val b1 = new Box(1)
b1.contains(b1.get)
Run Code Online (Sandbox Code Playgroud)
但是当使用存在类型时......
val b2 : Box[_] = new Box(1)
b2.contains(b2.get)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误(在scala 2.11.7中
[error] /private/tmp/exttest/test.scala:53: type mismatch;
[error] found : (some other)_$6(in value b2)
[error] required: _$6(in value b2)
[error] b2.contains(b2.get)
Run Code Online (Sandbox Code Playgroud)
我的假设是编译器会理解_$6
在两种情况下都使用相同的类型参数,但是它似乎失去了跟踪并将它们视为单独的类型.
我是否从根本上误解了存在类型的某些内容,或者这是Scala编译器中的错误 - 如果是这样,是否有最佳实践来解决它?
曾经有一段时间IE6缺乏对CSS功能的支持,例如"display:table-cell"和inline-block,导致"float"被劫持并用于布局 - 这是从未设计过的(或者特别擅长).
使用浮动似乎导致过于脆弱的布局难以维护,并且通常会随着动态内容的变化而完全破坏.
这是当时的一个必要的恶魔,但是现在对IE8之前的浏览器的支持不太重要了,理论上我们应该能够摆脱浮动并使用实际适用于布局的CSS部分 - 例如上述显示:table-cell和inline-block.
我目前正在考虑建议我的团队完全摆脱基于浮动的设计 - 我是否有把自己画到一个角落并遇到问题的风险,或者如果旧的浏览器支持对我们的项目不重要,这是一个更好的选择?
scala ×5
generics ×3
haskell ×2
aeson ×1
angularjs ×1
css ×1
css-float ×1
data-binding ×1
freemarker ×1
groovy ×1
haskell-lens ×1
html5 ×1
interface ×1
java ×1
javascript ×1
json ×1
layout ×1
monads ×1
postgresql ×1
reactjs ×1
requirejs ×1
sandbox ×1
sbt ×1
scala.js ×1
scalaz ×1
security ×1
shapeless ×1
sql ×1
sql-update ×1
typeclass ×1