Knockout.js ko.applyBindings后应用淘汰定制活页夹

Knockout.js ko.applyBindings后应用淘汰定制活页夹,knockout.js,Knockout.js,问题:既然绑定器在ApplyBindings()函数之后执行,我如何让绑定器应用它的绑定 我试着对它们进行不同的排序,相同的文件,不同的文件,等等。似乎什么都不起作用,我试着重新应用绑定,它对我大喊大叫,说每个上下文有多个绑定 我的观点 @* Page Content *@ <h1><span class="entity-type" data-bind="text: $data[0].EntityType"></span></h1> <a d

问题:既然绑定器在ApplyBindings()函数之后执行,我如何让绑定器应用它的绑定

我试着对它们进行不同的排序,相同的文件,不同的文件,等等。似乎什么都不起作用,我试着重新应用绑定,它对我大喊大叫,说每个上下文有多个绑定

我的观点

@* Page Content *@
<h1><span class="entity-type" data-bind="text: $data[0].EntityType"></span></h1>
<a data-bind="attr: { href: '/Entity/Create?EntityType=' + $data[0].EntityType() }" class="ignore">New</a>
<form>
    <table>
        <thead>
            <tr data-bind="template: { name: 'HeaderRowTemplate', foreach: $data[0].Properties }">
                <td data-bind="text: Name, visible: SummaryProperty"></td>
            </tr>
        </thead>
        <tbody data-bind="template: { name: 'DataRowTemplate', foreach: $data }">

        </tbody>
    </table>
</form>

@section Scripts {  
    @* Templates *@
    <script id="HeaderRowTemplate" type="text/html">
        <td data-bind="text: Name, visible: SummaryProperty"></td>
    </script>

    <script id="DataRowTemplate" type="text/html">
        <tr data-bind="template: { name: 'DataItemTemplate', foreach: Properties }"></tr>
    </script>

    <script id="DataItemTemplate" type="text/html">
        <td data-bind="visible: SummaryProperty">
            <input data-bind="editorFor: Value.ValueAsString" />
        </td>
    </script>
}
@*页面内容*@
@节脚本{
@*模板*@
}
我的MVC模型序列化:

@* Scripts *@
<script type="text/javascript">
    function ApplyBindings() {
        var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)),
            viewModel = ko.mapping.fromJS(data);
        ko.applyBindings(viewModel);
    }
    ApplyBindings();
</script>
ko.bindingHandlers.editorFor = { // Note: Binder is a Work-In-Progress.
    init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var val = valueAccessor(),
            dataType = bindingContext.$data.DataType,
            innerBindingContext = bindingContext.extend(valueAccessor);

        if (dataType() == 'unit') {
            // Bind to a input & dropdown.
            element.outerHTML += "<select data-bind='options: Value.Value.AllowedUnits'></select>";
            ko.applyBindingsToDescendants(innerBindingContext, element);
        } else if (dataType() == 'dropdown') {
            // Bind to a dropdown.
            element.outerHTML = "<select data-bind=\"options: Value.Value.DropDown.Options, optionsText: 'Name', optionsCaption: 'Desciption', value: $data.Value.Value.DropDown.Selected \"></select>";
        } else if (dataType() == 'entity') {
            // TODO: Add logic for entities later.

        } else {
            element.outerHTML = "<input data-bind=\"value: Value.ValueAsString\" />"; // Current Issue Area.
        }

        ko.applyBindingsToDescendants(innerBindingContext, element);
    },
    update: function (element, valueAccessor, allBindings, viewModel, bindingContex) {

    }
}
@*脚本*@
函数ApplyBindings(){
var data=@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)),
viewModel=ko.mapping.fromJS(数据);
应用绑定(视图模型);
}
ApplyBindings();
我的自定义活页夹:

@* Scripts *@
<script type="text/javascript">
    function ApplyBindings() {
        var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)),
            viewModel = ko.mapping.fromJS(data);
        ko.applyBindings(viewModel);
    }
    ApplyBindings();
</script>
ko.bindingHandlers.editorFor = { // Note: Binder is a Work-In-Progress.
    init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var val = valueAccessor(),
            dataType = bindingContext.$data.DataType,
            innerBindingContext = bindingContext.extend(valueAccessor);

        if (dataType() == 'unit') {
            // Bind to a input & dropdown.
            element.outerHTML += "<select data-bind='options: Value.Value.AllowedUnits'></select>";
            ko.applyBindingsToDescendants(innerBindingContext, element);
        } else if (dataType() == 'dropdown') {
            // Bind to a dropdown.
            element.outerHTML = "<select data-bind=\"options: Value.Value.DropDown.Options, optionsText: 'Name', optionsCaption: 'Desciption', value: $data.Value.Value.DropDown.Selected \"></select>";
        } else if (dataType() == 'entity') {
            // TODO: Add logic for entities later.

        } else {
            element.outerHTML = "<input data-bind=\"value: Value.ValueAsString\" />"; // Current Issue Area.
        }

        ko.applyBindingsToDescendants(innerBindingContext, element);
    },
    update: function (element, valueAccessor, allBindings, viewModel, bindingContex) {

    }
}
ko.bindingHandlers.editorFor={//注意:活页夹是一项正在进行的工作。
init:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){
var val=valueAccessor(),
dataType=bindingContext.$data.dataType,
innerBindingContext=bindingContext.extend(valueAccessor);
如果(数据类型()=='unit'){
//绑定到输入&下拉列表。
element.outerHTML+=“”;
applyBindingsTo子体(innerBindingContext,元素);
}else if(数据类型()=='dropdown'){
//绑定到下拉列表。
element.outerHTML=“”;
}else if(数据类型()==“实体”){
//TODO:稍后为实体添加逻辑。
}否则{
element.outerHTML=“;//当前问题区域。
}
applyBindingsTo子体(innerBindingContext,元素);
},
更新:函数(元素、valueAccessor、allBindings、viewModel、bindingContex){
}
}

利用knockout的模板引擎将是您的最佳选择

return ko.bindingHandlers.template.init(element, options, allBindingsAccessor, viewModel, bindingContext)
在传递从原始绑定处理程序接收到的参数时,从其他绑定处理程序中执行。显然,您可以随意使用选项,只需确保options对象包含“name”属性:

{ name: 'name-of-template', data: { foo1: 0, foo2: false } }

在这一点上,你不应该把绑定应用到任何事情上。

我不确定我是否完全理解?我目前正在使用模板,但是,我必须添加自定义活页夹来处理我的动态值。return语句应该完成什么?关键是使用另一个模板,而不是通过jQuery“添加HTML”。如果您通过knockout的模板绑定来处理这个问题,那么您的绑定将自动为您工作。