Binding 具有三个选项的击出式绑定
好的,我已经广泛地使用了KO风格的绑定来显示用户输入数据的内联验证,它非常有效。以下是我的一个绑定:Binding 具有三个选项的击出式绑定,binding,knockout.js,styles,Binding,Knockout.js,Styles,好的,我已经广泛地使用了KO风格的绑定来显示用户输入数据的内联验证,它非常有效。以下是我的一个绑定: data-bind='style: {backgroundPosition: ! currentRegistry().title() || !$root.currentRegistry().clientLogin() ? "top" : "bottom"} 我遇到的问题是,我想做这样的绑定,除了在第二个样式绑定上,如果if语句的计算结果为false,我希望它返回到前一个绑定设置的任何背景位置
data-bind='style: {backgroundPosition: ! currentRegistry().title() || !$root.currentRegistry().clientLogin() ? "top" : "bottom"}
我遇到的问题是,我想做这样的绑定,除了在第二个样式绑定上,如果if语句的计算结果为false,我希望它返回到前一个绑定设置的任何背景位置,而不是返回到底部:
data-bind='style: {backgroundPosition: ! currentRegistry().title() || !$root.currentRegistry().clientLogin() ? "top" : "bottom"}, style: {backgroundPosition: currentRegistry().title() && $root.currentRegistry().clientLogin() && ! $root.hasRegImage() ? "20px" : "bottom"}'
换句话说,对于第二个绑定,我想说样式:{backgroundPosition:if stuff?THIS}else不改变样式。希望这是有意义的,任何提示或指针,使这发生将不胜感激!谢谢
编辑:
尽管RodneyTrotter的解决方案无疑是获得相同功能的更优雅的方式,但我确实从一位同事那里学到了一种方法,它完全符合我的要求。我不知道你可以让每个属性都有条件,也就是:
data-bind='style: {backgroundPosition: ! $root.currentRegistry().clientLogin() || ! $root.currentRegistry().title() ? "top" : (! $root.hasRegImage() ? "20px" : "bottom")}'>
我将使用css绑定来实现这一点:您可能需要处理css类的顺序,以实现所需的结果 HTML
我将使用css绑定来实现这一点:您可能需要处理css类的顺序,以实现所需的结果 HTML
即使您已经接受了答案,我还是想添加一项内容。我认为关注点分离是一个重要的概念,在您继续使用Knockout时要牢记这一点 通常认为最好的做法是在视图模型中保留逻辑,在CSS中保留样式,并在绑定/html中同时保留这两种样式。有几个好处,但主要是它使代码更干净、更易于维护。罗德尼的回答让你朝着正确的方向迈出了一大步 就您最初的文章而言,您希望向视图模型添加函数,以便从绑定中提取逻辑。比如说,
var viewModel = {
backgroundStyle : function($root){
return !$root.currentRegistry().clientLogin() ||
!$root.currentRegistry().title() ?
"top" :
(! $root.hasRegImage() ? "20px" : "bottom");
}
}
然后您的绑定将简单地写为:
<div data-bind="style : {backgroundPosition : backgroundStyle($root)}"></div>
带视图模型
var viewModel = {
decideClassName : function($root){
return !$root.currentRegistry().clientLogin() ||
!$root.currentRegistry().title() ?
"foo" : (! $root.hasRegImage() ? "bar" : "");
}
}
我们的约束就变成了
<div data-bind="css : decideClassName($root)}"></div>
我还应该指出,这种类型的动态CSS类名绑定仅在淘汰版2.2.0或更高版本中可用
以这种方式保持代码的组织和关注点的分离可以帮助您轻松地发现bug、进行更改、与团队合作,而且最重要的是可能会引导您做出良好的实现决策。我最近提到,如果他们在视图模型中有自己的逻辑,而不是绑定,他们会很容易找到答案
我希望这些信息是有用的 即使您已经接受了答案,我还是想添加一个内容。我认为关注点分离是一个重要的概念,在您继续使用Knockout时要牢记这一点 通常认为最好的做法是在视图模型中保留逻辑,在CSS中保留样式,并在绑定/html中同时保留这两种样式。有几个好处,但主要是它使代码更干净、更易于维护。罗德尼的回答让你朝着正确的方向迈出了一大步 就您最初的文章而言,您希望向视图模型添加函数,以便从绑定中提取逻辑。比如说,
var viewModel = {
backgroundStyle : function($root){
return !$root.currentRegistry().clientLogin() ||
!$root.currentRegistry().title() ?
"top" :
(! $root.hasRegImage() ? "20px" : "bottom");
}
}
然后您的绑定将简单地写为:
<div data-bind="style : {backgroundPosition : backgroundStyle($root)}"></div>
带视图模型
var viewModel = {
decideClassName : function($root){
return !$root.currentRegistry().clientLogin() ||
!$root.currentRegistry().title() ?
"foo" : (! $root.hasRegImage() ? "bar" : "");
}
}
我们的约束就变成了
<div data-bind="css : decideClassName($root)}"></div>
我还应该指出,这种类型的动态CSS类名绑定仅在淘汰版2.2.0或更高版本中可用
以这种方式保持代码的组织和关注点的分离可以帮助您轻松地发现bug、进行更改、与团队合作,而且最重要的是可能会引导您做出良好的实现决策。我最近提到,如果他们在视图模型中有自己的逻辑,而不是绑定,他们会很容易找到答案
我希望这些信息是有用的 不能100%确定这是否准确回答了您的问题,但这也是有效的,而且非常有用: “风格”:某种条件?{'max-height':'100px'}:{} 允许您在不满足条件时不使用样式 此外,如果您使用的是组件,则可以调用 'style':$component.getStyleing$data 然后在GetStyleing中执行一些多行if语句逻辑来构造保存样式的对象
css绑定也是如此。不能100%确定这是否准确回答了您的问题,但这也是有效的,并且非常有用: “风格”:某种条件?{'max-height':'100px'}:{} 允许您在不满足条件时不使用样式 此外,如果您使用的是组件,则可以调用 'style':$component.getStyleing$data 然后在GetStyleing中执行一些多行if语句逻辑来构造保存样式的对象
css绑定也是如此。我相信这是最优雅、最恰当的方式。我相信这是最优雅、最恰当的方式 去做吧。