缺少参数的默认值

|| 我正在使用带有jQuery和jQuery模板的淘汰赛。假设我有一个需要人物对象的模板
<script type=\"text/html\" id=\"person_template\">
      <tr><td>Forename</td><td><input type=\"textbox\" data-bind=\"value:FORENAME\" /></td></tr>
      <tr><td>Surname</td><td><input type=\"textbox\" data-bind=\"value: SURNAME\"/></td></tr>
</script>
现在,如果我将仅带有FORENAME的对象传递给此模板,则会收到错误消息:   SURNAME未定义错误 我试图在Knockout中创建一个自定义绑定,但是在它到达之前就抛出了错误。 如果我在将对象传递给模板之前填写这些空白字段,我知道一切都会解决,但是我想将解决方案放在模板中,而不是在JavaScript中。 有谁知道一种可能对此类情况有用的方法?     
已邀请:
这有点挑战,因为您在模板中。在准备模板时,KO访问变量(嗯,实际上是KO构建的函数在jQuery Templates中对其进行访问)。 一种选择是将您的属性作为字符串传递给自定义绑定,并确保将其初始化。 就像:
ko.bindingHandlers.valueWithInit = {
    init: function(element, valueAccessor, allBindingsAccessor, context) {
        var value = valueAccessor();
        if (!context[value]) {
            context[value] = ko.observable();   
        }
        var realValueAccessor = function() {
             return context[value];   
        }

        //call the real value binding
        ko.bindingHandlers.value.init(element, realValueAccessor, allBindingsAccessor, context);
    },
    update: function (element, valueAccessor, allBindingsAccessor, context) {
        var realValueAccessor = function() {
             return context[valueAccessor()];   
        }

        //call the real value binding
         ko.bindingHandlers.value.update(element, realValueAccessor);   
    }
}
因此,这将验证您的对象是否具有该字段,如果没有,它将为该字段创建一个新的可观察对象。然后,将其交给实值绑定。 与此类似的一种非常类似(但不太冗长)的替代方法是,使绑定确保该字段存在,然后重写绑定属性以使用实际的
value
绑定。就像是:
//Another option: rewrite binding after making sure that it is initialized
ko.bindingHandlers.valueWithInit = {
    init: function(element, valueAccessor, allBindingsAccessor, context) {
        var value = valueAccessor();
        if (!context[value]) {
            context[value] = ko.observable();   
        }

        $(element).attr(\"data-bind\", \"value: \" + value);
        ko.applyBindings(context, element);
    }
}
这两个都假设您要传递的字段直接位于模板上下文的对象之外(因此,如果您传递的全局范围为\'viewModel.someProperty \'的东西将不起作用)。 这是同时具有两个选项的工作示例:http://jsfiddle.net/rniemeyer/dFSeB/ 我不想将字段作为字符串传递,但是我发现并没有很好的解决方法。     
您最好确保传递给模板的对象已设置了所有参数。如果没有设置,则可以添加默认值,但是将所有这些逻辑放入模板中会违反MVVM模式。模板(如mvc中的Views)不应包含任何逻辑IMO。     

要回复问题请先登录注册