【发布时间】:2012-10-11 21:14:26
【问题描述】:
简而言之,我相信我所追求的是一种在 MVC4 局部视图中为敲除绑定/javascript 对象提供范围/上下文的方法,这样我就可以重用相同的局部而不会让它们相互干扰,但仍然能够在客户端引用父子视图模型。
很可能作为一个淘汰新手(以及更广泛的网络开发人员)我在这里缺少一个常见的 javascript 概念模式,但我遇到的场景很像以下。我在服务器上有一个视图模型,比如说:
public class MainModel
{
// Other fields
SubviewModel Subview { get; set}
}
public class SubviewModel
{
// Relevant subview fields
}
然后在强类型(主)部分视图中渲染我需要的任何内容,并通过@Html.Action 将子视图模型传递到强类型部分(在服务器上)。在这两种情况下,我都会通过以下方式设置淘汰赛:
var mvcModel = ko.mapping.fromJS(@Html.Raw(JsonConvert.SerializeObject(this.Model)));
ko.applyBindings(mvcModel , document.getElementById("@("divSubview"+Model.Guid)"));
在这种情况下,divSubview 将是部分的主要包装 div,并且所有内容通常都可以很好地绑定 - 几乎。
Model.Guid 连接用于解决第一个问题,即这些部分通常在页面上针对不同的视图模型呈现多个。 (把它想象成一个项目列表,一个待办事项列表或诸如此类的东西,其中每个项目都有可能改变的子内容 - 你可能会明白,可能在我试图进一步解释之前......)所以当多个部分呈现在同一页面上时,如果 div 不是唯一命名的,如果我通过 document.getElementById 调用 applyBindings,我最终会将第二个 viewModel 应用到具有该名称的第一个渲染 div。
第二个问题是相关的,因为当我渲染主要部分(给定页面有多个),然后是子视图时,我经常想引用子视图中的主视图模型或类似的。我一直在使用的解决方法是设置一个命名的全局参数,然后使用它来来回引用,因为我知道脚本将按顺序执行 - 但这很 hacky。
那么我缺少什么正确的解决方案?
我知道我可以只使用 Knockout 的模板和一个更大的视图模型,最终这可能是正确的解决方案,但目前在 MVC 部分(与服务器紧密耦合)中发生了很多事情,我不是愿意放弃。 (其次,我现在尽量保持部分松散耦合 - 至少在客户端上 - 即使我在绑定/等方面受到了一些性能影响。)
(我认为)我真正追求的是一种将某种形式的范围传递给局部视图的方法,这样子视图局部视图将引用主局部视图模型(同样),而不必污染全局命名空间或使用唯一名称。有没有办法让我说表示客户端 JS 变量将引用子/父部分中的对象? (或者我完全没有抓住重点,还有更好的方法?)
【问题讨论】:
-
那你最后做了什么?
-
我实际上最终选择了 Angular,但这与我所寻找的有点无关。一般来说,虽然我认为你是对的,使用客户端表示的“经典”组合并绑定所有有路可走的东西(这是大多数 JS 框架最终的结果),所以我会给你点头。感谢您的意见!
标签: javascript knockout.js asp.net-mvc-4