【问题标题】:knockout js observe global variable淘汰js观察全局变量
【发布时间】:2013-03-22 16:31:19
【问题描述】:

我正在设置一个变量

var extQty;

然后用户输入一些数据并提交,我返回一个带有 extQty 的 json 字符串。成功后我正在更新变量:

    success: function (result) {
         window.extQty = result.extQty;
     }

如果 extQty 超过网格的行数,我需要隐藏一个按钮。我怎样才能做到这一点?我尝试了以下方法,但没有看到变量更改,因为它在 extQty 更新之前已经加载。

 <!-- ko if: pagedList().length < extQty -->

如果我把上面的 extQty 改成 3 就可以了...

【问题讨论】:

  • Knockout 使用 ko.observable 表示您希望 Knockout 在更改时知道的变量。也就是说,您为什么还要使用全局变量而不是使其成为您的视图模型的可观察属性?
  • 页面的另一部分抓取json数据,它是一个单独的函数。有更好的方法吗?
  • 如果你有一个对你的视图模型的引用(让它成为全局的,或者至少把它们放在同一个闭包中),有什么问题?或者您甚至可以使该函数也获取视图模型的 json 数据部分。

标签: javascript jquery knockout.js


【解决方案1】:

将您的变量设为ko.observable 并使其成为您的视图模型的一部分。

function viewModel() {
    this.extQty = ko.observable(0);
    this.pagedList = ko.observableArray();
    //....
}

var myViewModel = new viewModel(); 
ko.applyBindings(myViewModel);

然后在你的 AJAX success:

success: function (result) {
     myViewModel.extQty(result.extQty);
}

【讨论】:

  • 感谢您的回答,我在 jsfiddle 上发布了我的代码,所以您可以看到,我仍然遇到问题 - 我的代码告诉我未定义 extQty:@987654321 @
  • @Matt,如果你将变量作为模型的一部分,那么它就不再是全局的了。如果您必须观察window 对象的自定义子对象,例如window.test,该怎么办?
  • @Black - 我不知道你为什么要删除一个七岁的答案,但我不明白你的评论与远程相关。 OP 问题中的变量不需要是全局的。那么“如果是这样呢?”是无关紧要的,完全是一个不同的问题。 Knockout 观察视图模型。如果你想让它观察一些东西,把它放在视图模型中
  • 题目是“观察全局变量”而不是“观察viewmodel的变量”
【解决方案2】:

尝试更新您的小提琴:-

Your Fiddle Updated

<div data-bind="style: { display: (pagedList().length < extQty()) ? 'block' : 'none' }">
    <p class="pull-right">
        <a class="btn btn-primary" data-bind="click: $root.add" href="#" title="edit"><i class="icon-plus"></i>Add Extension</a>
    </p>
</div>

如果我错了,请纠正我,当您使用绑定时,它允许标记根据条件为真或假从您的文档中出现或消失。当您的条件为假时,当您在 html 中查看时,该元素将被注释掉代码。除非您刷新页面,否则无法更改。因此,使用可见绑定,标记保留在 dom 中,您可以使用可见绑定来隐藏或显示它...

看看Knockout If Binding documentation

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 2014-06-23
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2014-11-05
    • 2012-09-08
    • 2012-07-07
    相关资源
    最近更新 更多