knockout从函数中访问observable

时间:2017-12-20 11:14:20

标签: javascript mvvm knockout.js

我对这个问题很困惑。 Knockout使用ko.applyBindings()方法更新MVVM模式。在下面的代码中,您可以看到我的功能。首先,我创建一个空 vm ,然后我调用其他函数通过getJSON()方法填充数据。方法运行正常。

var vm = {};
function GetData(){
  vm=GetMockData();
  LoadUserData();
  LoadCategories();
  LoadSkills();
  return vm;
}

我的困惑从这里开始,我的工作是根据用户输入存储这个值。

 <input data-bind='' placeholder="Enter your name"/>

在顶部HTML部分,我想将该值绑定到类似于GetMockData().obj.User.Name的位置。但是没有工作。

function GetMockData(){
    var obj={
        User:{
            Name: ko.observable().extend({
                required: true,
                minLength: 2,
                maxLength: 15
            }),
            Surname: "Fake Surname"
        }
    return obj;
}

对于applyBindings(),我调用以下代码部分。

ko.applyBindings(new GetData());

我对以下部分感到困惑。从函数中获取User.Name,由另一个函数调用,因为我不是直接从applyBindings()而是从另一个函数到达那个部分。 我该如何调用它将数据绑定值写入HTML?

<input data-bind='' placeholder="Enter your name"/>

1 个答案:

答案 0 :(得分:0)

起初我对你在这里得到的东西感到非常困惑。即使在这一点上,我仍然不完全确定。但这是我帮助你的最佳尝试。

正如我所理解的那样,你要解决的主要问题是所谓的“保湿”问题。这是一个懒惰的执行过程,以填补其他东西。您还可以将其视为“重置”某事物状态的一种方式。下面是我如何解决这个问题的片段,例证了水合作用的两面。

<强>的JavaScript

function User() {
    var self = this;

    self.Name = ko.observable().extend({
        required: true,
        minLength: 2,
        maxLength: 15
    });

    self.Surname = ko.observable();

    self.Hydrate = function(){ 
        self.Surname("Fake SureName"); 
    };
};

function AppModel(){
    var self = this;

    self.User = {};

    self.Hydrate = function(){
        var user = new User();
        user.Hydrate();
        self.User = user;
    };
};

var app = new AppModel();
app.Hydrate();
ko.applyBindings(app);

现在我们已经确定了JavaScript方面,让我们继续讨论DOM。要在文本字段中接收用户的输入,您有两个主要选项:valuetextInputvalue更新关键字上的模糊事件textInput上的observable。您可以决定哪种方式最适合您。

<强> HTML

<input data-bind="textInput: User.Name" placeholder="Enter your name"/>

重要的是要注意,如果您希望扩展此解决方案,最好将视图模型函数(不是可观察的)应用于类的原型。像这样:

function AppModel(){
    var self = this;

    self.User = {};
};

AppModel.prototype.Hydrate = function(){
    var self = this;

    var user = new User();

    self.User(user);
};

作为旁注,通过查看您的代码,您似乎对如何“整理”淘汰解决方案缺乏一点了解。我强烈建议您查看淘汰网站上提供的tutorials以更好地了解架构。此次video,作为淘汰赛团队成员的Ryan Niemeyer,虽然陈旧,但仍然非常相关。