何时在knockoutJS中使用括号?

时间:2013-08-05 15:23:44

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

我知道你在knockoutjs中为ff使用paranthesis: *在代码中解除可观察的功能 *潜入具有声明性绑定的对象

或当你有一个具有某些属性的对象人员时: * person()。firstname *人()。年龄 (最右边的属性不需要括号)

现在我有这种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绑定的div切换显示/隐藏取决于复选框是否被选中,我尝试删除<div data-bind="fadeVisible: displayGuitars(), fadeDuration: 250">中的括号然后突然fadeVisible停止工作,div当我选中/取消选中复选框时,不再显示/隐藏。我的问题是为什么我需要使用fadeVisible绑定在div中的括号,如果它确实落在我上面提到的任何一个标准上,哪一个是它?

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

1 个答案:

答案 0 :(得分:3)

您的问题是您没有在自定义绑定中unwrap调用valueAccessor。看起来应该是这样的

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证明没有parens。顺便说一句,将来,当你有这样的代码来证明这个问题时,它有助于把你自己的小提琴放在一起,这样人们就可以快速查看问题。