我可以创建一个在knockout.js中使用其他绑定的自定义绑定

Joc*_*che 13 javascript knockout.js

我有一个自定义的翻译绑定:

ko.bindingHandlers.lang = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        this.lang = [
            'text1':'text1 translated'
            ,'text2':'text2 translated'
        ];
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var keyword = valueAccessor();
        var translatedString = this.lang[keyword];
        $(element).text(translatedString );
    }
};
Run Code Online (Sandbox Code Playgroud)

我用的是这样的:

<span data-bind="lang:'text1'"></span>
Run Code Online (Sandbox Code Playgroud)

但是,我还有一个用于创建表格格式的绑定:

ko.bindingHandlers.tableRow = {
    update : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        $(element).html("<td>" + valueAccessor()[0] + "</td><td>" + valueAccessor()[1] + "</td>");
    }
}
Run Code Online (Sandbox Code Playgroud)

我用的是这样的:

<tr data-bind="tableRow:['text1','text2']"></tr>
Run Code Online (Sandbox Code Playgroud)

对于这个问题:

现在我想结合这些绑定,所以我可以这样调用我的tableRow绑定:

<tr data-bind="tableRow:[lang:'text1','text2']"></tr>
Run Code Online (Sandbox Code Playgroud)

上面的代码仅仅是例如,实际上这些绑定中还有更多的内容.

我已多次阅读文档并花了很长时间寻找解决方案但找不到任何东西.也许是因为这不能做到?

Wir*_*rie 9

您需要做的就是将值从一个bindingHandler中继或修改为您要激活的其他值.

因此,在您的tablerow处理程序中,调用init和update(在各自的函数中):

ko.bindingHandlers.lang.init(element, valueAccessor, allBindingsAccessor, viewModel)
Run Code Online (Sandbox Code Playgroud)

当然需要根据需要修改参数.您可能会从数组中获取其中一个值,并将其作为第二个参数传递给init和update.

这也是激活其他标准内置绑定的好方法.

更新:添加@Joche的评论只是为了让它更具可读性:

var value = valueAccessor(); 
var newValueAccessor = function() {
    return translatedString; }; 
ko.bindingHandlers.lang.init(element, newValueAccessor,
       allBindingsAccessor, viewModel);
Run Code Online (Sandbox Code Playgroud)