将绑定上下文设置为属性

时间:2016-07-06 18:57:12

标签: javascript knockout.js knockout-3.0

我希望能够通过绑定到属性来创建绑定上下文,其方式与with绑定的工作方式类似:

<div data-bind="with: myData">
         <button data-bind="text: myHeader"></button>
</div>

但我不想使用with因为每次button更改时都会重新创建HTML元素(我的示例中为myData),请参阅http://knockoutjs.com/documentation/with-binding.html

  

如果您提供的表达式涉及任何可观察的值,则   只要有任何可观察的表达式,就会重新评估表达式   更改。然后,将清除子孙元素和新副本   标记的内容将添加到您的文档中并绑定在上下文中   新的评估结果。

所以我需要类似于with绑定的东西,让我们说context绑定:

<div data-bind="context: myData">
         <button data-bind="text: myHeader"></button>
</div>

<button>现已绑定到myData上下文,因此我不必撰​​写:

<div>
         <button data-bind="text: myData().myHeader"></button>
</div>

这也在描述中 http://www.knockmeout.net/2012/03/knockoutjs-performance-gotcha-1ifwith.html

  

with binding对于绑定嵌套非常方便   对象/模型,有助于保持数据绑定属性   变得过于冗长。然而,重要的是要了解这一点   带绑定将在绑定时重新呈现整个部分   价值变化。

KO中是否存在类似的内容?

1 个答案:

答案 0 :(得分:-1)

我不认为文档的引用意味着你的想法。

如果您在with绑定中使用的对象中存在可观察对象,并且这些可观察对象发生更改,那么具有with绑定的元素的主体将不会被重新生成无条件地

试试吧。运行此代码段并在计数器递增时输入input元素:

var vm = {
  sample: {
    counter: ko.observable(0)
  }
};

ko.applyBindings(vm);

setInterval(function () {
  vm.sample.counter( vm.sample.counter() + 1);
}, 1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div data-bind="with: sample">
  <input type="text" value="type here">
  <div>Counter: <span data-bind="text: counter"></span><div>
</div>

文档的含义:如果with绑定指向一个observable,那个可观察的更改,那么该元素的主体将被重新呈现。

“如果您提供的表达式涉及任何可观察值,”指的是您为with绑定提供的表达式。在您的情况下,表达式是单个值myDatamyData内是否有任何可观察的是完全不相关的。