【问题标题】:Visible binding with function having a parameter与具有参数的函数的可见绑定
【发布时间】:2011-10-03 13:37:18
【问题描述】:

我收到以下错误:

Microsoft JScript 运行时错误:无法解析绑定属性。
消息:TypeError:预期对象;属性值:可见:
IsVisible('Area')

我正在尝试根据一些评估隐藏/显示我的 html 元素。这是我的代码:

 var viewModel = {
            propertyTypeList: ko.observableArray([]),
            selectedPropertyType: ko.observable(""),
            visibleFeatures: ko.observableArray([]),
            IsVisible : function(featureName){some logic here}
        };

这是视图:

<div class="editor-field">
    <select data-bind="options: propertyTypeList, 
                       optionsText: 'PropertyTypeName', 
                       value: selectedPropertyType, 
                       optionsCaption: 'select property type...'">
    </select>
</div>

<div class="editor-label" data-bind="visible: IsVisible('Area')">
    Area
</div>
<div class="editor-label" data-bind="visible: IsVisible('Bedroom')">
  Bedroom
</div>

函数IsVisible 将根据selectedPropertyType 和功能名称进行一些评估,并将返回真或假。

【问题讨论】:

  • 应该可以;一个类似的例子适用于我 > jsfiddle.net/EhEsd 。选择数据绑定是否有效?
  • 文本和值绑定对我有效,如果视图模型中有布尔属性,则可见绑定有效。当它是一个函数时不起作用
  • 你能在 IsVisible 函数中展示你在做什么吗?它应该返回一个真/假。您上面的代码看起来已经设置好了,还有其他原因导致了这个错误。
  • 你是对的。我认为 IsVisible 的返回类型不正确
  • Pinakin Shah,我想你已经解决了这个问题。您能否发布您的解决方案并将其标记为已接受的答案以帮助社区?

标签: knockout.js


【解决方案1】:

尝试按以下方式调用方法

<div class="editor-label" data-bind="visible: $root.IsVisible('Area')">

<div class="editor-label" data-bind="visible: viewModel.IsVisible('Area')">

【讨论】:

    【解决方案2】:

    如果您希望这些 div 的可见性动态更改(您似乎可以这样做),您需要将 isVisible 设置为 computedObservable。这将确保 isVisible 逻辑在 observables(它所依赖的)发生变化时重新运行。

    它可以返回一个字符串,您可以将可见性绑定到 (data-bind="visible: isVisible() === 'Area'"),或者如果它们不相关,您可以为每个 div 创建不同的计算。 (isAreaVisilbe, isBedroomVisible, ...) 你的 viewModel 基本上变成了这样的东西:

    function ViewModel() {
        var self = this;
        self.propertyTypeList = ko.observableArray(['Area', 'Bedroom', 'Other']);
        self.selectedPropertyType = ko.observable("");
        self.visibleFeatures = ko.observableArray([]);
        self.visibleDiv = ko.computed(function () {
            //Your logic here
            return self.selectedPropertyType();
        });
    

    我在http://jsfiddle.net/ZqWDS/5/ 中做了一个我认为你正在尝试做的基本工作示例 必须将您的 viewModel 更改为一个函数,以便 isVisible 属性可以引用其他属性。 (How to reference properties of current object in JS)。您可以阅读淘汰赛 computedObservables 页面上标题为“简化事物的流行约定”的部分,了解有关我为什么以这种方式构建 viewModel 构造函数的更多详细信息。

    我不确定是什么导致了问题顶部的错误。我将您的代码粘贴到一个 jsFiddle 中,它基本上可以工作(有一些小的语法编辑)http://jsfiddle.net/GBkdK/

    如果您仍有问题并想提供更多背景信息,我很乐意提供帮助。

    编辑 抱歉,我认为 isVisible 需要计算是错误的。看来它可能只是您最初拥有的功能。 http://jsfiddle.net/ZqWDS/6/

    knockoutjs: can we create a dependentObservable function with a parameter?

    【讨论】:

    • 但是,您是否也可以向计算的 observable 发送一个参数以获得不同的结果?
    猜你喜欢
    • 2010-10-02
    • 2020-04-21
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多