【问题标题】:Computed Observable change does not update title attribute in UI (using knockout-bootstrap.js)Computed Observable 更改不会更新 UI 中的 title 属性(使用 knockout-bootstrap.js)
【发布时间】:2013-08-02 17:01:43
【问题描述】:

在这个 JS Fiddle 中是否有触发更新我的元素的 title 属性:

http://jsfiddle.net/YPXYJ/9/

请注意,元素的 data-bind 属性中的工具提示是 knockout-bootstrap.js 库的一部分

<label data-bind="text: copyOtherPartyHelpText()"></label>
<br />
<br />
 <i class="icon-question-sign" data-bind="tooltip: { title: copyOtherPartyHelpText(), placement: 'top', trigger: 'hover' }"></i>
<br />
<br />
<a style="cursor: pointer;" data-bind="click:changeHelpText">Click HERE To Change Label Text</a>

function MyViewModel() {
    this._copyOtherPartyHelpText = ko.observable();
    this.readOnlyView = ko.observable(true);


    this.copyOtherPartyHelpText = ko.computed({
        read: function () {
            var value = this._copyOtherPartyHelpText();

            if (value) {
                return value;
            }

            if (this.readOnlyView()) {
                value = 'Currently Disabled';
            } else {
                value = 'Match/agree to this term.';
            }
            //this makes things even worse, it is an initialization workaround
            //_copyOtherPartyHelpText(value);

            return value;
        },
        write: function (value) {
            this._copyOtherPartyHelpText(value);
        },
        owner: this
    });

    this.changeHelpText = function(){
        this.copyOtherPartyHelpText('help text updated but not tooltip');
    }
}


ko.applyBindings(new MyViewModel());

【问题讨论】:

  • 看起来你没有正确地制作 viewModel。
  • 这是我非常大的 viewModel 的摘录;)
  • 好吧,我们不能告诉你他的问题是什么,只有一半的问题。请尝试在较小的示例中重新创建问题,最好使用jsfiddle.net
  • 添加了一个小提琴,谢谢!

标签: javascript knockout.js


【解决方案1】:

控制台/浏览器错误日志会告诉你:

未捕获的引用错误:未定义 copyOtherPartyHelpText

您必须使用 this. 引用您的函数调用,否则内部函数将转而寻找 window.copyOtherPartyHelpText。

我建议在您的视图模型中使用一个名为 self 的局部变量(就像他们在 knockoutjs 文档和教程中经常做的那样),这样您就可以始终安全轻松地从内部引用它的属性,如您修改的JSFiddle:http://jsfiddle.net/YPXYJ/3/

function MyViewModel() {
    var self = this;

    // More code here...

    this.changeHelpText = function(){
        alert('changeHelpText called');
        self.copyOtherPartyHelpText('help text and UI updated');
    }
}

EDIT2:

在标题的工具提示绑定中,您不调用值访问器,而是像这样引用可观察函数:

旧:

<i class="icon-question-sign" data-bind="tooltip: { title: copyOtherPartyHelpText(), placement: 'top', trigger: 'hover' }"></i>

新:

<i class="icon-question-sign" data-bind="tooltip: { title: copyOtherPartyHelpText, placement: 'top', trigger: 'hover' }"></i>

见:http://jsfiddle.net/YPXYJ/11/

【讨论】:

  • @Brian 点击我链接的 JSFiddle,它对我有用。请注意,我仅在此处发布了我的修改的摘录,write 函数也有一个需要this(或在我的示例中为self)的引用。 - 编辑啊你删除了你的评论,现在我看起来很傻;-)
  • 知道了,谢谢,我放弃了,虽然这不是答案,因为我认为我不需要包括我正在尝试更新 UI 中的标题属性,但我这样做了,所以我改变了我的 JsFiddle
  • 感谢@UweB,是的,我知道 attr 绑定。工具提示绑定来自一个名为 knockout-bootstrap.js 的淘汰扩展库。我正在使用它从 Twitter Bootstrap 库中触发一个不错的工具提示覆盖。使用 Knockout 时很难调用 tooltip 初始化,一般在 document.ready 中进行
  • 是的,我想我终于修好了! :-)
【解决方案2】:

你需要“这个”。当参考 'this._copyOtherPartyHelpText()' 和 'this.copyOtherPartyHelpText()'

给你http://jsfiddle.net/FtMdZ/2/

ko.observable();
    this.readOnlyView = ko.observable(true);


    this.copyOtherPartyHelpText = ko.computed({
        read: function () {
            var value = this._copyOtherPartyHelpText();

            if (value) {
                return value;
            }

            if (this.readOnlyView()) {
                value = 'Currently Disabled';
            } else {
                value = 'Match/agree to this term.';
            }
            //this makes things even worse, it is an initialization workaround
            //_copyOtherPartyHelpText(value);

            return value;
        },
        write: function (value) {
            this._copyOtherPartyHelpText(value);
        },
        owner: this
    });

    this.changeHelpText = function(){
        alert('changeHelpText called');
        this.copyOtherPartyHelpText('help text and UI updated');
    }
}


ko.applyBindings(new MyViewModel());

【讨论】:

  • 我放弃了,虽然这不是答案,但我认为我不需要包括我正在尝试更新 UI 中的标题属性,但我这样做了,所以我有改变了我的 JsFiddle
  • @Brian - 你能澄清一下你的意思吗,因为我在 jsFiddle 的任何标签中都没有看到“title”属性。这是你想要做的更接近你的事情吗:knockoutjs.com/documentation/attr-binding.html
  • 所以对于我的问题,我使用了一个名为 knockout-bootstrap.js 的库。这添加了敲除绑定,以便 工作。如果您将鼠标悬停在 JSFiddle 最终结果中的小问号图标上,您会看到它显示了我的 Computed Observable 的原始值,而不是点击事件后我的更新值,非常感谢!
  • 感谢您的帮助@Xion Dark,希望我能给您一些帮助
猜你喜欢
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2015-10-25
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多