javascript - 什么时候在knockoutJS中使用括号?

标签 javascript data-binding knockout.js knockout-2.0

我知道你在 knockoutjs 中使用括号来表示 ff: * 在代码中解开可观察函数 * 深入研究具有声明性绑定(bind)的对象

或者当你有一个具有某些属性的对象时,例如: * person().名字 * 人().年龄 (最右边的属性不需要括号)

现在我有这种html/js:

<section>
      <label>
        <input data-bind="checked: displayGuitars" type="checkbox" />
         Display Guitars
      </label>
      <div data-bind="fadeVisible: displayGuitars(), fadeDuration: 250">
        <ul data-bind="foreach: products">
          <li>
            <span data-bind="text: model"></span>
          </li>
        </ul>
      </div>
      <div data-bind="dump: $data, enable: false"></div>
    </section>
<script>



  ..................................some code

   ko.bindingHandlers.fadeVisible = {
    init: function (element, valueAccessor) {
        // Start visible/invisible according to initial value
        var shouldDisplay = valueAccessor();
        $(element).toggle(shouldDisplay);
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        // On update, fade in/out
        var shouldDisplay = valueAccessor(),
            allBindings = allBindingsAccessor(),
            duration = allBindings.fadeDuration || 500; // 500ms is default duration unless otherwise specified

        shouldDisplay ? $(element).fadeIn(duration) 
            : $(element).fadeOut(duration);
    }
};


var vm = (function () {

    var data = mockdata.getProducts();
    var products = ko.observableArray(data);
    var displayGuitars = ko.observable(false);

    var vm = {
      displayGuitars: displayGuitars,
      products: products
    };

    return vm;
})();

ko.applyBindings(vm);
</script>

所以基本上它的作用是根据是否选中复选框来切换具有 fadeVisible 绑定(bind)的 div 的显示/隐藏,我尝试删除 <div data-bind="fadeVisible: displayGuitars(), fadeDuration: 250"> 中的括号。然后突然 fadeVisible 停止工作,当我选中/取消选中复选框时,div 不再显示/隐藏。我的问题是为什么我需要在具有 fadeVisible 绑定(bind)的 div 中使用括号,如果它确实符合我上面提到的任何标准,那么它是哪一个?

先生/女士,您的回答将会很有帮助。谢谢++

最佳答案

您的问题是您在自定义绑定(bind)中没有对 valueAccessor 进行 unwrap 调用。它应该看起来像这样

init: function (element, valueAccessor) {
        // Start visible/invisible according to initial value
        var shouldDisplay = ko.unwrap(valueAccessor());
        $(element).toggle(shouldDisplay);
    },

这将在 Knockout2.3 中工作,如果您有旧版本,则使用 ko.utils.unwrapObservable 代替。

这里是a fiddle在没有括号的情况下演示它。顺便说一句,将来,当您拥有这样的代码来演示问题时,它有助于将您自己的 fiddle 放在一起,以便人们可以快速查看问题。

关于javascript - 什么时候在knockoutJS中使用括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18061855/

相关文章:

javascript - getJSON 方法不起作用

WPF 边框 DesiredHeight

android - 未解析的引用 : databinding in Android studio 4. 1.3

knockout.js - 检查扩展是否应用于 observable

javascript - 更新 Knockout.js Observable 数组元素值

javascript - document.getElementById 在长函数之前不起作用?

javascript - 触发谷歌地图自动完成焦点

javascript - 信令 OpenTok 和 React

java - Spring MVC 3.0 下划线绑定(bind)请求参数

javascript - Knockout.js 验证文本框突出显示