首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更干净的数据-绑定在淘汰赛中?

更干净的数据-绑定在淘汰赛中?
EN

Stack Overflow用户
提问于 2017-02-10 14:54:45
回答 2查看 89关注 0票数 0

我刚开始使用Knockout,并且正在做一个非常基本的实现,用一个可以观察到的颜色来改变颜色。是否有更清晰的方法来编写以下代码?

代码语言:javascript
复制
<div class="selected" data-bind="style: { background: fullHexCode(mainScreenNavigationSelector()) !== false ? fullHexCode(mainScreenNavigationSelector()) : 'white' }"></div>

在我的页面上有多个位置,它们都对fullHexCode()函数使用不同的参数。看起来乱七八糟。任何帮助都会很好,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-10 14:59:47

看起来逻辑依赖于另一个可观测的,所以您可以使用一个可观测的计算值--在backgroundColor下面的代码段中,计算可观测性取决于可观测到的mainScreenNavigationSelector

这只是一个简单的例子,你必须根据你的具体情况来调整它。

代码语言:javascript
复制
var MyViewModel = function () {
  this.mainScreenNavigationSelector = ko.observable(false);

  this.backgroundColor = ko.computed(function() {
    return this.mainScreenNavigationSelector() ? 'green' : 'red'; 
  }, this);

  this.toggleColor = function() {
    this.mainScreenNavigationSelector(!this.mainScreenNavigationSelector());
  }
}

var viewModel = new MyViewModel();
ko.applyBindings(viewModel);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div class="selected" data-bind="style: { 'background-color': backgroundColor }">
  TEST
</div>

<button data-bind="click: toggleColor">Toggle Color</button>

票数 2
EN

Stack Overflow用户

发布于 2017-02-10 21:50:15

您可以通过在视图模型中定义方法来去复制HTML代码。命名计算更好,因为它们是自然回忆录,如果在HTML中重复使用,则只对其进行一次评估。

您还可以分解父节点中的重表达式(如: let: bindings )。例如:<div class='some-container' data-bind="let: { v: mainScreenNavigationSelector() }">... bindings based on v here... </div>

注意:为了这个目的,let比使用它更好。但这是一个新的绑定,将在下一个版本的KO中提供。您可以用自定义绑定填充它。

当HTML代码中无法避免JS表达式时,尽量使它们尽可能流畅。例如:

代码语言:javascript
复制
<div data-bind="style: {
     background: fullHexCode(mainScreenNavigationSelector()) || 'white'
}"></div>

在Javascript中,逻辑运算符不返回true或false,而是返回上一个评估参数的实际值。所以:

  • 如果不是“假”,则返回a,否则返回b。
  • A&B返回b如果a不是“假”,否则a

最后一个成语在KO绑定中很有用,因为与角相反,KO绑定是正则JS表达式。如果某些空/未定义发生在点序列中,它们就会失败(如a.b,如果a是未定义的)。

所以,与像data-bind="text: object != null ? (object.a != undefined ? object.a : 'None') : 'None'"这样的三级运算符不同,只需编写data-bind="text: object && object.a || 'None'"

而且,[]和{}也不是假的,这实际上是一件好事。它允许编写像data-bind="foreach: foo.optionalArray || ['default', 'stuff']"这样的东西

然而,Number(0)是错误的。因此,如果0是一个有效的对象id,那么要小心像data-bind="with: object.id && 'saved' || 'new'"这样的东西,它可能不能像预期的那样工作。

还有最后一招。如果data-bind="text: name"因名称未定义而失败,那么"data-bind="text: name || 'anonymous'"仍将失败,但"data-bind='text: $data.name || 'anonymous'"将按预期工作。按照惯例,我编写$data.attribute而不是attribute来传递有关处理可选属性的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42162325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档