这一定是非常愚蠢的事情.我刚刚开始玩scotty,无法正确提供静态内容.
import Network.HTTP.Types
import Web.Scotty
import qualified Data.Text as T
import Data.Monoid (mconcat)
import Data.Aeson (object, (.=))
import Network.Wai.Middleware.Static
main = scotty 3000 $ do
middleware $ staticPolicy (noDots >-> addBase "static")
get "/" $ file "index.html"
Run Code Online (Sandbox Code Playgroud)
很简单.这就是你在几本scotty教程中找到的内容.但由于某种原因它不起作用.在浏览器中通过'/'访问会给我'找不到文件'的东西.如果我在浏览器中键入"/index.html" - 它可以正常工作.但这是错的!我希望它可以通过'/'而不是'/index.html'访问.它忽略了root并直接获取html文件.如何通过'/'root提供index.html?没有太多的信息和我发现的几个教程指向上面的例子或类似的不能按预期工作.
我尝试将标题设置为'text/html',什么不是......没有运气.
我有一个最简单的情况
<!DOCTYPE html>
<html>
<head>
<title>Whatever</title>
</head>
<body>
<header></header>
<main></main>
<footer></footer>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
所以我希望我的标题可以说是15%,我的页脚是5%,而我的主要部分则占据了中间的剩余空间.我可以通过固定位置来做到这一切,但我想弄清楚弹性框.所以我的所有尝试都不起作用.根据这篇文章:Flexbox布局我应该这么简单:
html, body {
height: 100%;
width: 100%;
padding: 0;
margin: 0;
}
body {
display: flex;
flex-direction: column;
}
header {
height: 75px;
}
main {
flex: auto;
}
footer {
height: 25px;
}
Run Code Online (Sandbox Code Playgroud)
......但这不起作用.我尝试将像素从像素改为百分比 - 没有运气.中间部分刚刚坍塌而且没有伸展.
我还在Google热门首页中尝试了其他一些示例.什么都行不通.
我究竟做错了什么.如何通过柔性盒实现上述目标?
谢谢.
PS几乎忘记了.我的浏览器是Chromium 34.0.1847.116(260972)
我坚持这个小任务.我需要通过单击表单上的"添加"按钮动态生成表单输入字段.该表单应该创建DB表模式.因此,每个输入字段都是数据库表字段名称.
我可以动态生成字段但是在收集实际数据时遇到问题.
<form ng-controller="NewTableCtrl" ng-submit="submitTable()">
<input type='text' ng-model='table.title' placeholder='Title:'>
<input ng-repeat="field in fields" type='text' ng-model='table.fields' placeholder='Field:'>
<div>
<button type='submit'>Submit</button>
<button ng-click="addFormField()">Add</button>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
..和控制器
.controller('NewTableCtrl', function($scope) {
$scope.fields = [];
$scope.table = {};
$scope.addFormField = function () {
$scope.fields.push({});
}
$scope.submitTable = function () {
console.log($scope.table);
}
});
Run Code Online (Sandbox Code Playgroud)
看起来很简单 当我单击"添加"按钮时,它会生成新的输入字段,但它使用相同的模型对象(显着).这就是我的误解所在.我想如果我$scope.fields = [];在控制器中声明,那么重复字段数据就会进入数组.但它只是在每个重复输入字段中回显输入.我现在明白,这是双向绑定的方式.
我认为这样的原因是通过普通表单提交的类比,其中重复输入字段名称成为URL编码表单数据中的数组.
那么我该如何解决这个问题呢?服务器需要得到如下字段数组:fields: [field1, field2 ...]我是否需要为每个字段生成具有不同范围变量的输入字段?我该怎么做呢?
这比我想的更复杂,它需要是一个指令吗?如果是,请告诉我如何做到这一点.
谢谢.
说,我有一个简单的应用程序,它使用HDBC与数据库进行交互.它可以是一个快照应用程序或命令行应用程序.我想要一个关于此的通用视图 - 不是快照或任何特定的.一个很好的例子是"真实世界哈斯克尔"的第22章.
因此,我会将所有与SQL相关的函数(如connect,saveArticle,getArticle等)隐藏在单独的DB.hs文件中.所有DB函数都将连接句柄作为参数.
现在,我将如何启动连接并将其置于某种状态,以便所有这些数据库函数只使用它而无需单独启动连接?这可能吗?也许我在思考错误或考虑OO概念但是......我想"初始化"我的连接(就像你在OO中初始化一个对象一样).我不希望每个数据库函数都创建和关闭新连接.
我是否必须创建一个池并将池作为参数而不是连接句柄传递给函数?这样做的最简单的例子是什么?
无论是游泳池还是连接手柄,我如何将其置于一个状态,以便我的功能在需要时抓住它并且不会一直重复"打开"和"关闭"?如果是,它是如何正确完成的?
我是否需要创建一个池并将其置于一个状态,以便函数只查询池以获取来自全局状态的连接?再一次,例子将非常感激.
谢谢.
给定具有记录语法的示例数据类型:
data VmInfo = VmInfo {infoVid :: String
,infoIndex :: Int
,infoPid :: Int
,infoExe :: String
} deriving (Show)
Run Code Online (Sandbox Code Playgroud)
和(vmInfo :: String - > VmInfo)函数,它生成并返回上面给定vm name作为字符串的数据结构.
我可以看到两种方法来提取VmInfo数据类型的各个部分.
(VmInfo vid _ _ _) <- vmInfo vm
Run Code Online (Sandbox Code Playgroud)
这只是一种模式匹配.而......
vid <- infoVid <$> vmInfo vm
Run Code Online (Sandbox Code Playgroud)
使用记录语法编译生成的函数.
问题很简单:哪种方法更受欢迎?
打字量明智,他们是相同的,所以我正在寻找速度和正确/最佳实践.
我假设模式匹配会更快,但那么记录语法的重点是什么?
谢谢.
是否可以将列表参数从浏览器传递到Snap中的处理函数?如何从列表构造多参数URL并将其发送到处理函数?
例如,我需要删除一些表行或任何其他对象.我不能用通常的REST路由做到这一点:
("/objects/:id", method DELETE deleteObject)
Run Code Online (Sandbox Code Playgroud)
仅仅因为可能会有太多并且逐个删除100行可能会有点单调乏味.
我通过复选框输入选择了注定的对象,比如需要删除[3,4,6,8]行.那么如何将该列表传递给URL中的处理程序以及该操作的路由是什么样的呢?
好吧,我终于用jquery和ajax调用了.Snap的"getParams"函数可以处理多个参数URL,但我仍然无法弄清楚如何在没有jquery和ajax的情况下实际构建URL.
我使用javascript来收集要删除的项目并构建项目数组.然后我使用ajax构造多个参数URL并将其发送给处理程序.使用此方法和Snap几乎没有注意事项:
- Snaps的"getParams"函数仅支持旧式多参数URL:
"a=1&a=2&a=3&a=4"
Run Code Online (Sandbox Code Playgroud)
而不是新的:
"a[]=1&a[]=2&a[]=3&a[]=4"
Run Code Online (Sandbox Code Playgroud)
这使得传递复杂参数变得不可能
- 路线应该是:
("/objects/", method DELETE deleteObject)
Run Code Online (Sandbox Code Playgroud)
而不是:
("/objects/:ids", method DELETE deleteObject)
Run Code Online (Sandbox Code Playgroud)
我没有回答我的问题,因为我不相信这是通过snap传递多个参数URL的唯一方法.
虽然"getParams"可以处理它,但我的问题仍然存在:我如何构建URL并将其发送给处理程序?
例如,Rails在视图逻辑中使用"link_to"函数来构造URL.Snap不使用模板内部的任何逻辑,那么它是如何工作的呢?它只是不能在snap中传递多个参数URL的唯一方法是借助javascript ...?
请有人为我确认一下吗?
我试图用Haskell驱动程序向Riak介绍自己,并且我遇到了一个简单的put操作.我对put功能的签名感到困惑.那里的任何地方都没有一个例子.
所以有这个签名:
put :: (FromJSON c, ToJSON c, Resolvable c) => Connection -> Bucket
-> Key -> Maybe VClock -> c -> W -> DW -> IO (c, VClock)
Run Code Online (Sandbox Code Playgroud)
我有一些问题.
什么是Maybe VClock?我是否必须以某种方式生成它或者只是在那里指定Nothing就足够了?为什么我在返回的元组中得到这个VClock?
我是否必须为每个简单的值编写FromJSON和ToJSON实例,即使它是一个简单的字符串值?就像我想用"名称"键来设置值"Stitch"一样,我该怎么做?
什么是Resolvable实例?如何使Text或String值可解析?我知道我必须定义resolve函数,但我不太了解它的含义以及如何做到这一点.
我似乎无法掌握编译的抢劫概念.网上没有任何例子.我将如何将简单的代码片段从解释更改为已编译.
例如:
listUsersH :: AppHandler ()
listUsersH = do
users <- liftIO $ getColList "users"
let userListS = mapSplices userLinkS users
heistLocal (bindSplice "users" userListS) $ render "list-users"
where
userLinkS d = runChildrenWithText [("user",T.pack $ at "uname" d)]
Run Code Online (Sandbox Code Playgroud)
如何使用编译的抢劫执行"runChildren","mapSplices","bindSplice"和"render"的简单组合?
我理解这个概念是不同的,没有"heistLocal"..但我现在需要回过头来重新学习如何做一些基本的事情,比如以"for each"循环方式显示一堆记录.有人可以澄清这一点,并显示一个简单的例子,如上面的那个,但编译抢劫?
目前我甚至不知道如何使用编译的抢劫进行简单的变量替换.例如,这个:
simpleString = "Insert me..."
insertString = heistLocal (bindSplices spl) $ render "tst"
where
spl = [("var", textSplice simpleString)]
Run Code Online (Sandbox Code Playgroud)
请有人帮助我完成基本操作,或者将我指向一个带有一些最小例子的位置.我确实阅读了快照网站文档.
我开始使用mime来解析电子邮件并提取附件.我做的任何事情,当我把它写入磁盘时,二进制附件总是被破坏了.然后我意识到,由于一些奇怪的原因,当消息被解析为数据类型时,所有base64附件都已被解码.那是我的问题开始的时候.
如果是图像,则不起作用.我做的第一件事是将提取的Text附件转换为ByteString TE.encodeUtf8.没运气.我尝试了所有Text.Encoding函数将Text转换为ByteString - 没有任何作用.然后由于一些愚蠢的原因我将提取的文本转换/编码回base64,然后我再次从base64解码它,这次它工作.为什么?
因此,如果我将提取的附件编码为base64并将其解码回来,它就可以工作.
B.writeFile "tmp/test.jpg" $ B.pack $ decode $ encodeRawString True $ T.unpack attachment
为什么?为什么Text到ByteString的简单编码不起作用,但上面的愚蠢呢?
最后,我打它了一点,到了点,当它与作品Data.ByteString.Char8像这样B.writeFile "tmp/test.jpg" $ BC.pack $ T.unpack attachment
所以我还是将文本转换为字符串,然后字符串ByteString.Char8才把它的作品,我也得到廉洁形象.
可以请有人解释这一切.为什么这种痛苦与二进制图像附件?为什么我不能将base64解码的Text转换为ByteString?我错过了什么?
谢谢.
UPDATE
这是根据请求提取附件的代码.我认为它与文本编码/解码无关.
import Codec.MIME.Parse
import Codec.MIME.Type
import Data.Maybe
import Data.Text (Text, unpack, strip)
import qualified Data.Text as T (null)
import Data.Text.Encoding (encodeUtf8)
import Data.ByteString (ByteString)
data Attachment = Attachment { attName :: Text
, attSize :: Int
, attBody :: Text
} deriving …Run Code Online (Sandbox Code Playgroud) 我最近开始玩 rollupjs。根据可用文档配置所有内容并将其捆绑在一起后,我从外部库中收到了许多有关未定义对象的错误。此类错误:Cannot read property 'parse' of undefined来自 crypto-js。它抱怨代码中的这一行:var ciphertext = Base64.parse(openSSLStr)。所以Base64是未定义的。我很少遇到来自捆绑的不同外部库的类似错误。
我使用了一些外部依赖项:chart.js、crypto-js、mithril、moment、pluralize
它们都与 完美配合jspm。我决定尝试 rollup 来加快速度,因为 jspm 目前太慢了。现在我的一半外部依赖项停止工作。我只收到来自外部库的“未定义的东西”和“...不是函数”类型的错误。
可能是什么原因造成的?
这是我的 rollup.config.js
import babel from 'rollup-plugin-babel';
import npm from 'rollup-plugin-npm';
import commonjs from 'rollup-plugin-commonjs';
import uglify from 'rollup-plugin-uglify';
export default {
entry: 'app/scripts/application/main.js',
format: 'cjs',
plugins: [
npm({
jsnext: true,
main: true,
}),
babel({
exclude: 'node_modules/**',
presets: [ 'es2015-rollup' ],
}),
commonjs(),
uglify(),
],
dest: 'static/js/application.js',
};
Run Code Online (Sandbox Code Playgroud)
如果需要任何其他详细信息,请告诉我。
谢谢。
编辑
我已经完成了一个简单的测试重现,将那些在我的应用程序中生成错误的库捆绑在一起。
包.json
{ …Run Code Online (Sandbox Code Playgroud) haskell ×7
angularjs ×1
css ×1
css3 ×1
haskell-wai ×1
html ×1
javascript ×1
riak ×1
rollupjs ×1