Jquery templates 缺少参数的默认值

Jquery templates 缺少参数的默认值,jquery-templates,knockout.js,Jquery Templates,Knockout.js,我在jQuery和jQuery模板中使用Knockout。假设我有一个需要person对象的模板 名字 姓 现在,如果我将一个只有名字的对象传递给这个模板,我将得到一个错误: 未定义姓氏错误 我试图在Knockout中创建一个自定义绑定,但在它到达之前就抛出了错误 如果在将对象传递给模板之前填写这些空字段,我知道一切都会解决,但我希望在模板中而不是在javascript中找到解决方案 是否有人知道一种方法可以帮助解决这种情况?最好确保传递给模板的对象中设置了所有参数。如果它们不是,那么您可

我在jQuery和jQuery模板中使用Knockout。假设我有一个需要person对象的模板


名字
姓
现在,如果我将一个只有名字的对象传递给这个模板,我将得到一个错误:

未定义姓氏错误

我试图在Knockout中创建一个自定义绑定,但在它到达之前就抛出了错误

如果在将对象传递给模板之前填写这些空字段,我知道一切都会解决,但我希望在模板中而不是在javascript中找到解决方案


是否有人知道一种方法可以帮助解决这种情况?

最好确保传递给模板的对象中设置了所有参数。如果它们不是,那么您可以添加默认值,但将所有这些逻辑放在模板中会违反MVVM模式。模板(如mvc中的视图)不应该包含任何逻辑。

这有点挑战性,因为您在一个模板中。在准备模板时,KO访问变量(实际上,它是由KO构建的函数在jQuery模板中访问的)

一个选项是将属性作为字符串传递给自定义绑定,并确保它已初始化

就像:

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);   
    }
}
因此,这将验证您的对象是否具有该字段,如果没有,则会为该字段创建一个新的可观察对象。然后,它将其交给真正的值绑定

一个非常类似(但不太详细)的替代方法是让绑定确保字段在那里,然后重写绑定属性以使用真实的
绑定。比如:

//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”,则它将不起作用)

以下是一个包含两个选项的工作示例:


我不希望将字段作为字符串传递,但我看到的不是一种很好的方法。

是的,我不想将所有逻辑都包含在模板中,但由于模板知道哪些参数应该可用,我猜它应该有一些功能来填充缺少参数的默认值。谢谢你的帮助,这正好满足了我的需要:)
//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);
    }
}