Javascript 如何在knockout.js中创建转换器?
我在一个使用JavaScript库的项目中工作。我有一个名为BaseViewModel的视图模型,有一个名为isAuthenticated的可观察属性 isAuthenticated属性由布尔类型填充,对于经过身份验证的人员,为true;对于未经身份验证的人员,为false。下面是一个简单的例子:Javascript 如何在knockout.js中创建转换器?,javascript,knockout.js,converter,Javascript,Knockout.js,Converter,我在一个使用JavaScript库的项目中工作。我有一个名为BaseViewModel的视图模型,有一个名为isAuthenticated的可观察属性 isAuthenticated属性由布尔类型填充,对于经过身份验证的人员,为true;对于未经身份验证的人员,为false。下面是一个简单的例子: var BasicViewModel = { this.isAuthenticated = ko.observable(); } 在我的项目中,此属性绑定在span元素上,如下代码所示: &l
var BasicViewModel = {
this.isAuthenticated = ko.observable();
}
在我的项目中,此属性绑定在span元素上,如下代码所示:
<span id="parking" data-bind="text: BasicViewModel.isAuthenticated"></span>
现在,我将在span元素中显示一个文本,如下所示:
- 认证
- 未经认证
<span id="parking" data-bind="text: BasicViewModel.isAuthenticated, Converter=myConverter"></span>
转换器没有直接的类似解决方案。做类似的事情有多种方法 自定义绑定处理程序 最接近转换器工作方式的是创建自定义绑定。使用WPF,您将同时拥有一个转换器和一个值绑定,在自定义绑定处理程序中,您可以同时执行这两个操作 默认的
text
绑定可以被视为文本值的绑定,该绑定将文本值呈现为纯文本。您可以重用其逻辑并创建一个绑定处理程序,以不同的方式呈现布尔可观测值:
ko.bindingHandlers.textBool = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var field = ko.utils.unwrapObservable(valueAccessor());
field = !!field ? "So True!" : "False!";
ko.bindingHandlers.text.update(element, function() { return field; });
}
};
然后像这样使用它:
<span data-bind="textBool: BasicViewModel.isAutenticated"></span>
function ViewModel() {
var self = this;
self.isAuthenticated = createBoolComputed(/* parameters optional */);
}
您甚至可以将其分解为要使用的效用函数,而不是ko.computed
,例如:
function createBoolComputed(trueText, falseText) {
var _isAuthenticated = ko.observable(false);
trueText = trueText || "True!";
falseText = falseText || "False!";
return ko.computed({
read: function() { return _isAuthenticated() ? "True!" : "False..."; },
write: function(val) { _isAuthenticated(val); }
);
}
然后像这样使用它:
<span data-bind="textBool: BasicViewModel.isAutenticated"></span>
function ViewModel() {
var self = this;
self.isAuthenticated = createBoolComputed(/* parameters optional */);
}
自定义模板
如果您进一步偏离了WPF转换器的类比,您也可以为此使用模板。如果您想为不同的值呈现特殊的DOM,这将特别有用 我认为最简单的方法就是编写一个转换函数并在绑定中调用它
函数ViewModel(){
var self=这个;
self.isAuthenticated=ko.可观察(假);
self.myConverter=函数(bool){
var值=ko.展开(布尔);
返回值?'Authenticated':'notauthenticated';
};
setTimeout(函数(){
自我验证(真实)
}, 1500);
}
应用绑定(新的ViewModel())代码>
我只需要使用一个普通的只读计算程序,从中读取已验证的内容,并返回要显示的文本。其他任何事情似乎都是多余的
函数ViewModel(){
var self=这个;
self.isAuthenticated=ko.可观察(假);
self.isAuthenticatedText=ko.computed(函数(){
返回self.isAuthenticated()?“已验证”:“未验证”
});
setTimeout(函数(){
自我验证(真);
}, 1500);
}
应用绑定(新的ViewModel())代码>
比计算变量更通用的解决方案是自定义绑定