【问题标题】:Accessing Knockout.js viewmodel properties in javascript在 javascript 中访问 Knockout.js 视图模型属性
【发布时间】:2017-08-30 22:01:52
【问题描述】:

我有以下视图模型:

var ViewModel = function (myList) {
    var self = this;

    this.sName = ko.observable($('#s-input').select(0).val());
};

我想访问存储在 sName 中的值来做一些验证:

在提交时,我调用一个验证函数来检查属性是否设置为某个特定值。但我无法访问属性 sName。 Documentation 表示我们可以通过

来访问该值
ViewModel.sName()

我无法让它工作。我试过 ViewModel.sName()、ViewModel().sName() 等。

有人有想法吗?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    您创建的结构是构造函数。

    您需要通过执行以下操作来创建 ViewModel 的实例:

    var vm = new ViewModel(list);
    

    然后,你可以通过vm.sName() 来访问 observable 的值;

    【讨论】:

    • 我很抱歉,但我不明白你指的是什么.. 我从哪里得到列表?如果我必须创建一个对象,那么我需要引用旧的构造函数。
    • @Amit,您了解您在问题中发布的代码吗?您已经创建了一个名为 ViewModel 的构造函数,它接受一个名为 myList 的参数。 RP 只是给你一个如何使用你自己的代码的例子。
    【解决方案2】:

    这可能比您需要的解释更多,但看起来您将对象定义与对象混淆了。您发布的代码定义了function,而不是object。注意第一行:

    var ViewModel = function (myList) { ...  
    

    在这里,您实际上是在定义一个 javascript“类”(javascript 并没有真正的类,但它是有用的术语)。我们将此定义称为constructor,因为当我们调用它时它会构造该类型的对象。您仍然需要将该类型实例化到对象中,然后才能像对象一样使用它。

    RP Niemeyer 向您展示了如何做到这一点。因为您的constructor 带有myList 参数,所以RP 传入了一个列表。通常,您将从服务器提供此列表作为视图模型中的初始数据。在您的具体情况下,您似乎没有使用它,因此您可以忽略它。

    您可能会考虑的一件事是将您正在使用的 jQuery 选择器作为参数传递,以便可以重用它。看起来像这样:

    var ViewModel = function (selector) {
        var self = this;
    
        self.sName = ko.observable($(selector).select(0).val());
    };
    var vm = new ViewModel('#s-input');
    var name = vm.sName(); //This is your name property!!
    

    【讨论】:

    • 谢谢你的详细解释.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2020-05-07
    • 2012-03-10
    相关资源
    最近更新 更多