我一直在构建一个简单的应用程序来学习angular.js.到目前为止,我连接了MEAN堆栈中的所有部分,我能够从Mongo中保存和检索数据.
该应用程序本质上是一个待办事项列表.用户可以创建一个项目,在项目内部创建带有"todos"的"卡片",然后可以从一个状态移动到另一个状态("积压","正在进行","完成"等)
我希望能够将通知推送给所有连接的人,告诉他们的应用程序需要刷新才能获得最新的待办事项.换句话说,假设用户A向项目A添加了一张新卡,我想向正在观看项目A的所有用户发送消息,以便他们的应用程序发出项目刷新以获得最新和最好的.
有关如何进行的任何建议?我需要将哪种技术添加到MEAN堆栈才能执行此类操作?
提前致谢
我有一个ASP.NET3.5(C#)ASPX页面,它以10种不同的语言进行国际化.
该页面结构非常复杂,有几十个由状态机模式驱动的嵌套视图.
编辑:我meta:resourcekey在每个asp控件中使用语法,允许使用隐式资源表达式的声明性语法.
我被要求根据一些查询字符串参数"标记"页面.品牌化不仅意味着加载不同的CSS文件,还意味着具有不同的文本模糊(在所有语言中).
是否有一种简单的方法来"交换"resx文件,而无需为此页面上的每个数百个文字和图像手动获取资源?
换句话说,假设我有以下RESX文件:
brand1_myPage.aspx.en-US.resx
brand1_myPage.aspx.de-DE.resx
brand1_myPage.aspx.fr-FR.resx
brand2_myPage.aspx.en-US.resx
brand2_myPage.aspx.de-DE.resx
brand2_myPage.aspx.fr-FR.resx
Run Code Online (Sandbox Code Playgroud)
myPage.aspx将查找名为myPage.xx-XX.resx的 resx文件.
有没有办法加载brand1xxx.resx文件或brand2xxx.resx基于某些值?
提前致谢.
是否有关于如何构建基于多对多关系的Kentico CMS门户实施的最佳实践(即销售食品并且有大部分食谱的网站 - 每种产品都用于许多食谱,每个食谱可以使用网站上销售的许多产品)?
Kentico是否只是错误的工具,或者Kentico中是否有解决方案来处理这种关系?
在沙盒应用程序上工作以学习angular.js我在代码中的几个地方遇到了以下模式.我发现自己不得不在循环中查询mongoDB.据我了解,每次调用都发生在自己的异步任务中.我如何知道所有任务何时完成?
例如,我有一系列状态.通常我需要为每个状态将someProperty设置为someNewValue.一旦所有状态都已更新,我想调用someFunction().
for (var i = 0; i < $scope.states.length; i++) {
$scope.states[i].someProperty = someNewValue;
$scope.states[i].$update({stateId: $scope.states[i].id}, function() {
someFunction();
});
}
Run Code Online (Sandbox Code Playgroud)
现在,我能想到这样做的唯一方法是每次更新成功时调用someFunction().我知道必须有一个更聪明,更好的方法.
你的方法是什么?
最近,我一直试图了解使用Service Locator"反模式"和使用Castle Windsor容器之间的区别.我在互联网上找到了一些信息,我总结了迄今为止在未完成的博客文章中学到的内容.
编辑:到目前为止,我一直认为依赖注入是保证分离所需要的.但在我看到的任何地方,我都看到了像温莎城堡这样的容器方向.我想清楚地了解原因.请... 向我解释这就像我是一个6岁的孩子 :)
我继承了一个现有的Sitecore实现,该实现具有使用相同模板的大型内容文件夹.一些文件夹包含数百篇文章.不同类型的角色应该对不同的文件夹感兴趣.我不想逐篇文章为每个页面设置Personas和Profile属性.理想情况下,我只想为整个文章文件夹输入一次属性.在这种情况下,最佳做法是什么?
我应该为每种类型的文章创建不同的模板吗?或者有没有办法从内容树中的父项继承这些属性?
谢谢
编辑
我与Sitecore USA的首席技术官John West在线交谈.以下是他解决这个问题的建议.我想在这里分享它们,因为其他人可能有兴趣解决类似的问题.
我不知道任何现有的继承这些值的解决方案,但可能还有其他方法(可能类似于语言回退).
如果模板的数量相对较少,我可能会采用模板方法 - 将现有模板转换为所有现有项的模板的基本模板,并相应地更新插入选项.将这些东西放在文件夹中并不会有什么坏处,但它们不会以这种方式继承这些值(你可以实现一些如上所述继承它们的东西).这里的一个好处是您可以使用标准值更新这些详细信息,这些信息将适用于基于这些模板的所有项目.
另一种方法是实现布局和安全预设之类的东西,但是对于这些其他值.
无论您做什么,请确保当用户创建新项目时,他们可以每日应用这些属性,或者自动应用这些属性.
另一种方法是编写一个更新现有项目的脚本,但这对将来的项目没有帮助(除非您执行类似保存处理程序的操作以在创建时自动应用相同的值).也许从该父文件夹中复制值.
我喜欢在现有模板中添加一个布尔字段的想法,该模板控制该项是否应该从其直接父项复制配置文件值,然后在该字段设置为true时实现一个保存处理程序来执行复制.所以我问约翰是否有关于如何构建这样的处理程序的文档.这是他的回复:
这解释了您可以利用项目创建/更改来设置值的一些方法:
我假设你可以使用一个项目:保存的事件处理程序.我避免使用item:创建处理程序,因为如果我的逻辑出错,我希望它在下一个save事件中再次运行.在您的情况下,如果这些字段为空,您可能想要设置该值.
您可以使用工厂将参数传递给事件处理程序以避免硬编码.例如,您可以传递数据库名称master(如果保存的项目位于不同的数据库中,则中止处理程序)和受影响的模板ID列表.然后,您可以在以后更轻松地将模板添加到列表中.
以下是有关事件的一些信息:
http://sdn.sitecore.net/Articles/API/Using%20Events.aspx
这包括一个使用保存处理程序的示例:
我已经定义了一系列自定义帖子类型(即"PortfolioPage"和"PortfolioGallery").
他们每个人都使用一个名为"艺术家"的自定义分类法.
有没有办法限制最终用户在每个PortfolioPage/PortfolioGallery帖子中输入AT MOST ONE艺术家?
在WFFM中有一个选项,以便当有人放弃表单时,表单中输入的任何数据都会被记录下来,并且可以通过Dropout Report访问.
我有一个WFFM,我已经开启了Analytics并打开了dropout功能.不幸的是,我没有看到数据库中记录的任何数据和Dropout报告是可见的,但是空的.
我从WFFM文件夹中包含的javascript代码中看到,一系列AJAX调用应该保存模糊事件的字段 - 调用/ sitecore modules/web/Web Forms for Marketers/Tracking.aspx
我尝试调试Javascript代码,但该方法应该将信息发布到/ sitecore modules/web/Web Forms for Marketers/Tracking.aspx永远不会被调用.你能想到这个代码不起作用的任何原因吗?此外,有谁知道这个信息应该记录在哪个表中?它是WFFM DB中的字段表吗?
最后,即使我已经在这个特定的WFFM表单上启用了分析,并且我已经将一个活动和一个目标与提交表单相关联,但这些都没有被记录下来.我看到表单中输入的数据已成功存储并显示在数据报告中,但没有关于广告系列和目标的信息记录在数据库中.
我甚至直接在运行的DMS DB中手动检查:
select top 10
p.DateTime, p.UrlText, cp.CampaignName
,i.Url, vi.VisitId
from pages p
inner join ItemUrls i on p.ItemId = i.ItemId
inner join Visits vi on vi.VisitId = p.VisitId
inner join GeoIps g on vi.Ip = g.Ip
left join Campaigns cp on cp.CampaignId = vi.CampaignId
order by p.DateTime desc
Run Code Online (Sandbox Code Playgroud)
这个显示正在命中呈现表单的页面,但没有与该访问关联的活动.
然后我尝试了以下内容:
select pe.datetime, ped.Name, pg.UrlText from PageEvents pe
inner join PageEventDefinitions …Run Code Online (Sandbox Code Playgroud) 假设我有一个经典的页面布局.
现在让我们说所有这些都可以在页面编辑器中进行编辑,让我们添加一个事实,即我希望所有内容都能通过工作流程.
当编辑进入特定页面(比如"关于我们"页面)时,当他点击编辑时,Sitecore究竟应该做什么?该页面上显示的所有项目是否会切换到DRAFT状态?或者只有当编辑器实际上编辑了页面上显示的某些"内容项"中的某些内容时才会发生这种情况?
当页面提交审批时会发生什么?修改后的所有子项是否也会进入"已提交审批"状态并出现在审批者/发布者的工作箱中?
如果没有开箱即用,怎么能实现这一切?有没有人已经解决了这个问题并成功解决了它?这似乎是一个常见的问题,但我似乎无法找到关于如何将这些联系起来的任何指导.
谢谢,FG
在我的Neo4J数据库中,我有一系列通过双链表实现的卡片队列.数据结构显示在下图中(使用Alistair Jones的Arrows在线工具生成的队列的SVG图):

由于这些是队列,我总是从队列的TAIL添加新项目.我知道双关系(下一个/上一个)不是必需的,但它们简化了两个方向的遍历,所以我更喜欢它们.
这是我用来插入新"卡片"的查询:
MATCH (currentList:List)-[currentTailRel:TailCard]->(currentTail:Card) WHERE ID(currentList) = {{LIST_ID}}
CREATE (currentList)-[newTailRel:TailCard]->(newCard:Card { title: {{TITLE}}, description: {{DESCRIPTION}} })
CREATE (newCard)-[newPrevRel:PreviousCard]->(currentTail)
CREATE (currentTail)-[newNextRel:NextCard]->(newCard)
DELETE currentTailRel
WITH count(newCard) as countNewCard
WHERE countNewCard = 0
MATCH (emptyList:List)-[fakeTailRel:TailCard]->(emptyList),
(emptyList)-[fakeHeadRel:HeadCard]->(emptyList)
WHERE ID(emptyList) = {{LIST_ID}}
WITH emptyList, fakeTailRel, fakeHeadRel
CREATE (emptyList)-[:TailCard]->(newCard:Card { title: {{TITLE}}, description: {{DESCRIPTION}} })
CREATE (emptyList)-[:HeadCard]->(newCard)
DELETE fakeTailRel, fakeHeadRel
RETURN true
Run Code Online (Sandbox Code Playgroud)
查询可以分为两部分.在第一部分:
MATCH (currentList:List)-[currentTailRel:TailCard]->(currentTail:Card) WHERE ID(currentList) = {{LIST_ID}}
CREATE (currentList)-[newTailRel:TailCard]->(newCard:Card { title: {{TITLE}}, description: {{DESCRIPTION}} })
CREATE (newCard)-[newPrevRel:PreviousCard]->(currentTail)
CREATE (currentTail)-[newNextRel:NextCard]->(newCard) …Run Code Online (Sandbox Code Playgroud) 我一直在偷看Sitecore.Kernel,但似乎无法找到Sitecore运行Initialize管道的地方.它是在每个页面请求上运行还是仅在应用程序启动时运行一次?你能指出我为这个管道调用Run方法的确切位置吗?
更新
有理由我最后问这个问题是因为我在Sitecore的代码中追溯mvc.requestBegin管道的执行.这是我发现的:
Initialize管道运行InitializeRoutes处理器...Sitecore.Mvc.Pipelines.Loader.InitializeRoutes.Process(PipelineArgs args)
来电... Sitecore.Mvc.Pipelines.Loader.InitializeRoutes.RegisterRoutes(RouteCollection routes, PipelineArgs args) 来电...Sitecore.Mvc.Pipelines.Loader.InitializeRoutes.SetRouteHandlers(RouteCollection routes, PipelineArgs args)创建新RouteHandlerWrapper对象这里的事情有点模糊......
Sitecore.Mvc.Routing.RouteHandlerWrapper.GetHttpHandler(RequestContext requestContext) 回报 (IHttpHandler) new RouteHttpHandler最后......
Sitecore.Mvc.Routing.RouteHttpHandler.ProcessRequest(HttpContext context) 来电...Sitecore.Mvc.Routing.RouteHttpHandler.BeginRequest()运行mvc.requestBegin管道我之前从未使用过async方法,但我发现自己构建了一个监视工具,并认为我可以使用这种方法来加快速度.
该工具定义了SiteConfigurations列表,每个SiteConfiguration都有一个要测试的监视器列表(通过HTTP请求).该工具的体系结构基于管道,例如:
MonitorSuccessPipeline执行MonitorFailurePipeline执行SiteAfterMonitorsPipeline执行EndEnginePipeline执行最初的方法是遍历所有,SiteConfigurations并为每个人运行所有相关的Monitors.
总执行时间:100个SiteConfigurations x 4监视器每个监视器x~1秒=运行约400秒.
所以我把我RunMonitor变成了async(实际的方法比你在这里看到的更多,这是方法的"核心"):
private async Task<Result> RunMonitor(Monitor currentMonitor)
{
Result result = new Result();
var client = new HttpClient();
var response = client.GetAsync(currentMonitor.TestUrl);
var content = await response.Result.Content.ReadAsStringAsync();
bool containSuccessText = content.Contains(currentMonitor.SuccessText);
bool isOk = status == HttpStatusCode.OK;
result.Success = containSuccessText && isOk;
if (result.Success)
{
ExecutePipeline("MonitorSuccessPipeline", currentMonitor); …Run Code Online (Sandbox Code Playgroud) sitecore ×4
c# ×3
angularjs ×2
javascript ×2
mongodb ×2
.net ×1
asp.net ×1
async-await ×1
asynchronous ×1
callback ×1
cypher ×1
kentico ×1
many-to-many ×1
mean-stack ×1
neo4j ×1
oop ×1
page-editor ×1
queue ×1
resx ×1
sitecore-dms ×1
sitecore6 ×1
taxonomy ×1
wordpress ×1