ParseException при объединении NVelocity с KnockoutJS

Я пытаюсь сделать учебник по нокауту с помощью NVelocity. Все было хорошо, но с шаблоном возникла проблема. Когда я дохожу до третьего шага этого руководства, я получаю сообщение об ошибке в строке ${meal().mealName} . Может ли кто-нибудь объяснить мне, почему это происходит?

Вот трассировка стека:

[ParseException: Encountered "().mealName}</td>\r\n            <td>" at line 50, column 23.
Was expecting one of:
    "}" ...
    <DOT> ...
    ]
   NVelocity.Runtime.Parser.Parser.Parse(TextReader reader, String templateName) +257
   NVelocity.Runtime.RuntimeInstance.Parse(TextReader reader, String templateName, Boolean dumpNamespace) +327
   NVelocity.Runtime.RuntimeInstance.Parse(TextReader reader, String templateName) +71
   NVelocity.Template.Process() +252

[ParseErrorException: Encountered "().mealName}</td>\r\n            <td>" at line 50, column 23.
Was expecting one of:
    "}" ...
    <DOT> ...
    ]
   NVelocity.Template.Process() +585
   Castle.MonoRail.Framework.Views.NVelocity.CustomTemplate.Process() +266
   Castle.MonoRail.Framework.Views.NVelocity.CustomResourceManager.ProcessResourceWithSensibleExceptionWrapping(String resourceName, Resource resource) +67

[ResourceProcessingException: Unable to process resource 'Home\index.vm': Encountered "().mealName}</td>\r\n            <td>" at line 50, column 23.
Was expecting one of:
    "}" ...
    <DOT> ...
    ]
   Castle.MonoRail.Framework.Views.NVelocity.CustomResourceManager.ProcessResourceWithSensibleExceptionWrapping(String resourceName, Resource resource) +117
   Castle.MonoRail.Framework.Views.NVelocity.CustomResourceManager.GetResource(String resourceName, ResourceType resourceType, String encoding) +663
   NVelocity.Runtime.RuntimeInstance.GetTemplate(String name, String encoding) +81
   NVelocity.Runtime.RuntimeInstance.GetTemplate(String name) +104
   NVelocity.App.VelocityEngine.GetTemplate(String name) +71
   Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine.Process(String viewName, TextWriter output, IEngineContext context, IController controller, IControllerContext controllerContext) +593
   Castle.MonoRail.Framework.Services.DefaultViewEngineManager.Process(String templateName, TextWriter output, IEngineContext context, IController controller, IControllerContext controllerContext) +262
   Castle.MonoRail.Framework.Controller.ProcessView() +170
   Castle.MonoRail.Framework.Controller.RunActionAndRenderView() +2529
   Castle.MonoRail.Framework.Controller.Process(IEngineContext engineContext, IControllerContext context) +74
   Castle.MonoRail.Framework.BaseHttpHandler.Process(HttpContext context) +175

[MonoRailException: Error processing MonoRail request. Action index on controller Home]
   Castle.MonoRail.Framework.BaseHttpHandler.Process(HttpContext context) +505
   Castle.MonoRail.Framework.BaseHttpHandler.ProcessRequest(HttpContext context) +53
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

person kekewong    schedule 29.08.2011    source источник
comment
Кто проголосовал против? Это совершенно ясный и актуальный вопрос. Не голосуйте против только потому, что вы не понимаете, о чем идет речь.   -  person Mauricio Scheffer    schedule 29.08.2011


Ответы (1)


$ - специальный символ как для NVelocity, так и для jQuery (по умолчанию), вызывающий конфликт. Однако это можно изменить для jQuery с помощью jQuery.noConflict. Используя это, вы можете установить jQuery $ на какой-либо другой символ, хотя я не уверен на 100%, что это также работает для шаблонов jQuery (что и используется в нокауте).

В качестве альтернативы вы можете захотеть попробовать использовать data-bind вместо ${ ... }

person Mauricio Scheffer    schedule 29.08.2011