我可以创建一个使用knockout.js中其他绑定的自定义绑定吗
Can I create a custom binding that uses other bindings in 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 );
}
};
我这样使用:
<span data-bind="lang:'text1'"></span>
然而,我也有一个用于创建表行格式的绑定:
ko.bindingHandlers.tableRow = {
update : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
$(element).html("<td>" + valueAccessor()[0] + "</td><td>" + valueAccessor()[1] + "</td>");
}
}
我这样使用:
<tr data-bind="tableRow:['text1','text2']"></tr>
对于问题:
现在我想组合这些绑定,这样我就可以这样调用我的tableRow绑定:
<tr data-bind="tableRow:[lang:'text1','text2']"></tr>
当然,上面的代码只是举例,实际上在这些绑定中还有更多内容。
我已经阅读了多次文档,花了很长时间寻找解决方案,但什么都找不到。也许是因为无法做到这一点?
您所需要做的就是将值从一个bindingHandler传递或修改到另一个要激活的bindingHandler。
因此,在表行处理程序中,调用init和update(在它们各自的函数中):
ko.bindingHandlers.lang.init(element, valueAccessor, allBindingsAccessor, viewModel)
当然,根据需要修改参数。您可能会从数组中获取其中一个值,并将其作为第二个参数传递给init和update。
这也是激活其他标准内置绑定的好方法。
更新:添加@Joche的评论只是为了让它更可读:
var value = valueAccessor();
var newValueAccessor = function() {
return translatedString; };
ko.bindingHandlers.lang.init(element, newValueAccessor,
allBindingsAccessor, viewModel);
您是否可以不将转换作为一个普通函数,然后从表行绑定中调用它?
var translate = function(text)
{
this.lang = [
'text1':'text1 translated'
,'text2':'text2 translated'
];
},
var translatedString = this.lang[text];
return translatedString;
}
};
然后,您可以向tableRow方法传递一个额外的参数,以指示是否需要翻译:
然后,您可以在表行绑定函数中调用此函数:
ko.bindingHandlers.tableRow = {
update : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var text1 = valueAccessor()[2] ? translate(valueAccessor()[0]) : valueAccessor()[0];
var text2 = valueAccessor()[2] ? translate(valueAccessor()[1]) : valueAccessor()[1];
$(element).html("<td>" + text1 + "</td><td>" + text2 + "</td>");
}
}
然后您可以直接从绑定元素调用它:
<span data-bind="text: translate(text1())"></span>
相关文章:
- 基本D3.js:如何将具有其他属性的数据绑定到元素
- 如何将单击事件绑定到其他类
- 设置操作系统特定的键绑定 - Mac 上的 cmd 并在其他所有内容上按 Ctrl
- 挖空、视图模型位于其他对象和数据绑定中
- 将事件绑定到其他UI组件's函数,在Kendo MVVM中
- 由其他Ember Select填充的Ember Select不更新选择绑定
- 创建一个计算值数组,该数组绑定到AngularJS中的其他输入
- ng绑定html,变量名来自ng repeat,但在其他地方定义了变量
- 如何绑定'这'到react类之外的函数,后者是来自其他组件的回调
- 如何将新函数绑定到元素的 onclick 事件,并使其在所有其他绑定函数之前运行
- 将对象的属性与其他对象的属性中的值绑定
- 当调用jQuery's.trigger()函数到绑定到该元素的其他处理程序的传播停止
- 如何绑定和解除绑定无限ajax滚动,以便其他jQuery正常工作
- 解除绑定实际上并不起作用:还有其他解决方案吗
- jQuery:将 onClick 绑定到指向其他页面的所有锚点,目标=_self
- 我可以将HTML元素绑定到js函数吗(而不是其他方式)
- 有没有其他优雅的方法来做函数绑定
- 数据绑定到我的应用程序,如果写在其他浏览器选项卡
- 允许先触发其他绑定元素事件
- 如何在moment.js中使用KnockoutJs绑定将日期转换为其他格式