我们正在使用Backbone,RequireJS和Handlebars构建一个非繁琐的Web应用程序,好吧,我只是很好奇.目前,我们的每个型号排序如下:
define(['Backbone', 'js/thing/a', 'js/thing/b', 'js/lib/bob'], function(a, b, bob) {
return Backbone.Router.extend({
// stuff here
});
});
Run Code Online (Sandbox Code Playgroud)
其中thing/a,thing/b都有自己的依赖关系,例如Handlebars模板等.现在发生的是在我的main.js中,所有"顶级"路由器都被加载并初始化; 每个顶级路由器都有一组依赖项(模型,视图等),每个依赖项都有自己的依赖项(模板,帮助程序,工具等).基本上,一个大树结构.
这种情况下的问题是整个树在页面加载时被解析并加载.我不介意每个人,因为我们最终将通过优化器运行它并最终得到一个大的单个文件(将RequireJS简化为基本上模块化框架).但是,我很好奇你是否可以按需加载视图和模板等内容.
还有就是"简化CommonJS的包裹解释说:" 在这里,所以我试过了:
define(function(require) {
Backbone = require('Backbone');
return Backbone.Router.extend({
doStuff: function() {
var MyView = require('js/myView');
new MyView().render();
}
});
});
Run Code Online (Sandbox Code Playgroud)
但是,看看Chrome的网络检查器,似乎RequireJS - 即使没有触发触发doStuff处理程序的路径 - 仍会加载myView
依赖项.问题:
require()
没有实际触发doStuff
路线的情况下寻找呼叫?在过去的几个月里,我和我的同事已经成功构建了一个服务器端系统,用于向iPhone设备发送推送通知.基本上,用户通过RESTful webservice(Spray-Server,最近更新为使用Spray-can作为HTTP层)注册这些通知,并且逻辑使用Akka的调度程序调度一个或多个消息以便将来调度.
这个系统,正如我们构建的那样,简单地工作:它可以每秒处理数百甚至数千个HTTP请求,并且可以以每秒23,000的速率发送通知 - 如果我们减少日志输出,可能会更多,添加多个通知发送方actor(以及与Apple的更多连接),并且可能在我们使用的Java库(java-apns)中进行一些优化.
这个问题是关于如何做对的(tm).我的同事,更了解Scala和基于演员的系统,注意到应用程序不是一个"纯粹的"基于演员的系统 - 他是对的.我现在想知道的是如何正确地做到这一点.
目前,我们有一个Spray HttpService
actor,而不是子类,用一组指令来初始化,这些指令概述了我们的HTTP服务逻辑.目前,非常简化,我们有这样的指令:
post {
content(as[SomeBusinessObject]) { businessObject => request =>
// store the business object in a MongoDB back-end and wait for the ID to be
// returned; we want to send this back to the user.
val businessObjectId = persister !! new PersistSchedule(businessObject)
request.complete("/businessObject/%s".format(businessObjectId))
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我做对了,那么来自演员的'等待回应'就是基于演员的编程中的禁忌(加上!!已被弃用).我认为"正确"的方法是将request
对象传递persister
给消息中的actor,并在request.complete
从后端收到生成的ID后立即调用它.
我已经在我的应用程序中重写了其中一条路线来做这件事; 在发送给actor的消息中,还发送请求对象/引用.这看起来像是应该的:
content(as[SomeBusinessObject]) { businessObject => request =>
persister ! new …
Run Code Online (Sandbox Code Playgroud) 我在周日下午摆弄着,正试图创造一种"房间"结构.基本上,一个Room
对象有许多出口,每个出口都指向其他Room
的出口.现在,我要创建的第一件事是两个Room
相互连接,最好是在一个赋值语句中.像这样:
case class Room(title: String, exits: Map[Direction.Direction, Room])
val firstRoom = Room("A room", Map(North -> Room("Another room", Map(South -> firstRoom))))
Run Code Online (Sandbox Code Playgroud)
Ergo:第一个房间有一个出口North
到第二个房间,第二个房间有一个出口South
回到第一个房间.
但是,正如您可以想象的那样,这是错误的:firstRoom
在创建val时未定义val,因此在分配期间尝试引用它将不起作用.
对于大多数(如果不是全部)编程语言,我很确定这是正确的.我的问题:如何在不使我的Room
对象变为可变的情况下解决这个问题?我可以简单地创建一些Room
对象并在之后添加出口,但这使得Room
s 变得可变,并且作为个人练习我试图避免这种情况.
我们有一个backbone.js应用程序,它向用户显示许多表单.我们想要的是非常简单:如果用户转到另一个页面而不保存填写的表单,我们想要显示一个确认对话框.
在经典形式中,这很容易,只需在jQuerysh中实现window.onbeforeunload(或$(window).on('beforeunload')).但骨干应用程序通常只有一个视图.我尝试使用onHashChange,但在该回调中返回false并不会阻止Backbone仍然转到另一个视图.
指针表示赞赏.搜索互联网并没有找到任何有效的回复.
我有一个理论,但我不知道如何测试它.我们有一个相当大的iOS项目,包括大约200个Swift文件和240个obj-C文件(以及相同数量的头文件).我们仍然使用Swift 1.2,这意味着整个项目都会经常重建.
我注意到每个.swift文件大约需要4-6秒才能编译; 在其他项目中,这最多为2.
现在,我注意到在构建输出中,头文件中生成的警告会针对每个.swift文件重复出现,这让我相信swift编译器会重新解析桥接头中包含的所有头文件.由于我们在桥接头中有~160个import语句,因此这种情况相加.
所以,基本问题:
我有一个演员 - 从本质上讲 - 维护一个对象列表.它有三个基本操作,一个是添加,更新和删除(有时删除是从add方法调用的,但除此之外),并且可以使用单个集合.显然,后备列表是同时访问的,添加和删除调用不断交错.
我的第一个版本使用了ListBuffer,但我在某个地方阅读它并不意味着并发访问.我没有获得并发访问异常,但我确实注意到从中查找和删除对象并不总是有效,可能是由于并发.
我正在重写它以使用var List,但是从Scala的默认不可变List中删除项目有点痛苦 - 我怀疑它适合并发访问.
所以,基本问题:我应该在并发访问情况下使用哪种集合类型,以及如何使用它?
(也许是次要的:一个Actor实际上是一个多线程实体,还是只是我的错误概念,它是否在一个线程中一次处理一个消息?)
(第三级:在Scala中,哪种集合类型最适合插入和随机访问(删除/更新)?)
编辑:对那些响应者:原谅我迟到的回复,我正在制作一个讨厌的习惯,因为在SO或邮件列表上倾倒问题,然后转到下一个问题,暂时忘记原始问题.
我正在努力使Polymer 2.0与Typescript一起工作,并且在制作构造函数时会遇到问题,其中库(包括Polymer 2)不会暴露正确的打字文件.在最简单的情况下:
class MyView1 extends Polymer.Element {
public static is = 'my-view1';
constructor() {
super(); // [ts] Call target does not contain any signature
}
}
Run Code Online (Sandbox Code Playgroud)
为了使它在没有构造函数的情况下完全编译,我declare var Polymer: any;
在一个主.d.ts
文件中完成了一个.
现在,我有两个问题:
我有一个生成LI列表的JSP文件,其中列表中的第一个和最后一个项目分配给它们的特殊类.我目前使用以下位:
<c:set var="liclass">
<c:if test="${rowStatus.first}">first</c:if>
<c:if test="${rowStatus.last}"> last</c:if>
</c:set>
<%-- not very pretty --%>
<li<c:if test="${not empty liclass}"> class="${liclass}"</c:if>>
Run Code Online (Sandbox Code Playgroud)
在这种情况下的问题是,在只有一个结果的情况下,该类应该变为"第一个最后"(它起作用),但它变成了first [...] last
,其中[...]代表了一堆SO过滤掉的空白.
似乎<c:set>
也需要使用由缩进引起的空白.我可以通过键入它而不用空格来解决它:
<c:set var="liclass"><c:if test="${rowStatus.first}">first</c:if><c:if test="${rowStatus.last}"> last</c:if></c:set>
Run Code Online (Sandbox Code Playgroud)
但我更喜欢可读的变体.另一种方法是通过一个删除多余空格的函数来拉取结果.
问题:是否有一种方法或技术可以避免在<c:set>
-tag中设置这样的空格?
我有一个简单的Actor使用ScalaQuery查询数据库,我已经嘲笑过对使用它的客户端的测试.
我想要的是(模拟)Actor Some(MyObject)
如果ID匹配则回复,None
否则.但是,我无法弄清楚如何使这项工作.这是我到目前为止的代码:
def receive = {
case FetchSomething(someId) => {
if (someId == 1234) self.channel ! someObject
else self.channel ! None
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它不会返回None
客户端代码,而是返回Some(None)
- 这当然会让我的客户端感到困惑.我希望客户端如何工作是这样的:
val object = persister !! FetchSomething(1337) match {
case myObject: Some[MyObject] => myObject
case _ => None
}
Run Code Online (Sandbox Code Playgroud)
(当然,以上可能只是错误 - 而不是Some
,它可能是Option
)
我怎样才能做到这一点?也许更具体一点,我如何None
通过self.channel 发送回来,所以当匹配它时,它是None
不是Some(None)
?
scala ×4
actor ×2
akka ×2
backbone.js ×2
javascript ×2
collections ×1
concurrency ×1
conditional ×1
el ×1
immutability ×1
ios ×1
js-amd ×1
jsp ×1
jstl ×1
option ×1
requirejs ×1
spray ×1
swift ×1
typescript ×1
whitespace ×1