如何解决缺少参数的默认值
|| 我正在使用带有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,context);
},update: function (element,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,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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。