Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MVC4局部视图中的敲除绑定_Javascript_Knockout.js_Asp.net Mvc 4 - Fatal编程技术网

Javascript MVC4局部视图中的敲除绑定

Javascript MVC4局部视图中的敲除绑定,javascript,knockout.js,asp.net-mvc-4,Javascript,Knockout.js,Asp.net Mvc 4,简言之,我认为我所追求的是一种在MVC4局部视图中提供作用域/上下文以剔除绑定/javascript对象的方法,这样我就可以重用相同的局部视图,而不会使它们相互干扰,但仍然能够在客户端引用父子视图模型 作为一个优秀的noob(实际上是更广泛的web开发人员),我很可能在这里缺少一个常见的javascript概念模式,但是我遇到的场景非常类似于下面的场景。我在服务器上有一个viewmodel,比如说: public class MainModel { // Other fields

简言之,我认为我所追求的是一种在MVC4局部视图中提供作用域/上下文以剔除绑定/javascript对象的方法,这样我就可以重用相同的局部视图,而不会使它们相互干扰,但仍然能够在客户端引用父子视图模型

作为一个优秀的noob(实际上是更广泛的web开发人员),我很可能在这里缺少一个常见的javascript概念模式,但是我遇到的场景非常类似于下面的场景。我在服务器上有一个viewmodel,比如说:

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将是partial的主包装器div,所有内容通常都绑定得很好——几乎没有绑定

Guid连接用于解决第一个问题,即这些部分通常在一个页面上针对不同的viewmodels呈现多个。(将其视为一个项目列表、待办事项列表或诸如此类的内容,其中每个项目都有可能发生变化的子内容-您可能在我试图进一步解释之前就知道了…)因此,当多个部分呈现在同一页面上时,如果div不是唯一命名的,如果我通过document.getElementById调用applyBindings,最后,我将第二个viewModel应用于具有该名称的第一个渲染div

第二个问题是相关的,当我呈现主部分(对于给定页面有多个),然后是子视图时,我通常希望在子视图中引用主视图模型,或者类似地。我一直在使用的解决方法就是设置一个命名的全局参数,然后使用它来来回引用,因为我知道脚本将按顺序执行——但这是非常粗糙的

那么,我缺少的正确解决方案是什么

我知道我可以只使用Knockout的模板和一个更大的viewmodel,最终这可能是正确的解决方案,但目前在MVC部分(与服务器紧密耦合)有很多事情我不愿意放弃。(第二,目前我正在尽可能地保持部分之间的松散耦合——至少在客户机上是这样——即使我在绑定方面受到了一些性能影响/等等)


(我认为)我真正想要的是一种将某种形式的作用域传递给partials的方法,这样子视图partial就可以引用主部分viewmodel(同样地),而不必污染全局名称空间或使用唯一的名称。有没有一种方法可以让我说,表示一个客户端JS变量,该变量将引用子/父部分中的一个对象?(或者我完全没有抓住要点,还有更好的方法吗?

从长远来看,最好咬紧牙关,使用映射插件的经典组合,将顶级视图模型的JSON表示形式呈现到页面中进行初始化,并使用子视图模型的模板。但我理解你的痛苦重新存在MVC的部分逻辑,所以

当前是否将单独的脚本块渲染为每个子部分视图的一部分,以创建其淘汰视图模型并应用其绑定

您能否在页面中定义某种模块,该模块拥有顶级视图模型,并在子部分呈现时将其子视图模型以增量方式添加到该页面中,然后在页面底部的DOM就绪状态下应用绑定

因此,每个子部分的脚本块将调用模块上的某个函数,传递子模型的原始JSON,其中包括其Guid键。然后,您的模块创建子视图模型的新实例,并将父视图模型设置为其中的引用,并将其推送到父视图模型上的子视图模型的可观察数组中。那么,每种方式都有一个参考

我不确定您是否可以为这种结构使用某种页面级管理器(如果您所说的不污染全局名称空间就是这个意思的话)。在任何情况下,将这些局部视图模型全部归单个对象所有而不是浮动在全局命名空间中不是很好吗?(如有的话)

希望我能正确理解你的上下文


更新:在某种意义上,您的部分仍然是松散耦合的。标记中的绑定表达式显然必须与子视图模型的实例相关,但可以是通过todo列表项上的foreach链接的数据上下文,也可以是使用“with”表达式显式设置的,例如,使用其他模块。RandomStandalonesSubviewModel

那么,您最终使用了什么?我实际上最终选择了Angular,但这与我想要的有点无关。总的来说,尽管我认为你是对的,使用客户端表示和绑定所有东西的“经典”组合是有出路的(这是大多数JS框架的最终结果),所以我同意你。感谢您的投入!