简而言之,我相信我所追求的是一种在 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 变量,该变量将引用子/父部分中的对象? (或者我完全没有抓住重点,还有更好的方法吗?)