Javascript 使用模块模式的knockoutjs不工作

Javascript 使用模块模式的knockoutjs不工作,javascript,knockout.js,module-pattern,Javascript,Knockout.js,Module Pattern,我正在尝试使用模块模式创建简单的淘汰示例 var login = {}; //login namespace //Constructor login.UserData = function () { var self = this; self.UserName = ko.observable(""); self.Password = ko.observable(""); }; //View-Model login.UserVM = function () { t

我正在尝试使用模块模式创建简单的淘汰示例

var login = {}; //login namespace

//Constructor
login.UserData = function () {
    var self = this;
    self.UserName = ko.observable("");
    self.Password = ko.observable("");
};
//View-Model
login.UserVM = function () {
    this.userdata = new login.UserData(),
    this.apiUrl = 'http://localhost:9090/',
    this.authenticate = function () {
        var data = JSON.parse(ko.toJSON(this.userdata));
        var service = apiUrl + '/api/Cryptography/Encrypt';
        DBconnection.fetchdata('POST', service, JSON.stringify(data.Password), response, function () { console.log('Cannot fetch data') }, null, true);
        function response(res) {
            console.log(res)
        }
    }
    return {
        authenticate: this.authenticate
    }
}();

$(function () {
    ko.applyBindings(login.UserVM); /* Apply the Knockout Bindings */
});
HTML代码:

<form id="loginform" name="loginForm" method="POST">
    <div id="form-root">
        <div>
            <label class="form-label">User Name:</label>
            <input type="text" id="txtFirstName" name="txtFirstName" data-bind="value:login.UserData.UserName" />
        </div>
        <div>
            <label class="form-label">Password:</label>
            <input type="text" id="txtLastName" name="txtLastName" data-bind="value:login.UserData.Password" />
        </div>
        <div>
            <input type="button" id="btnSubmit" value="Submit" data-bind="click: authenticate" />                
        </div>
    </div>
</form>

用户名:
密码:
问题是,单击submit时,我无法在viewmodel中获取userdata。它返回的是未定义的,登录对象保留了textbox的更改值,但单击后返回的是黑色值。 请让我知道


您还可以让我知道如何在同一代码中实现定义模块模式。

您从
登录返回的对象。UserVM
只有
身份验证
属性,没有
用户数据
apiUrl
属性。因此,与其使用来创建对象,不如将
login.UserVM
设置为类似于
login.UserData
的构造函数。然后使用创建viewModel对象。现在,viewModel将具有
userdata
apirl
属性(从函数中删除
return

此外,还需要将HTML绑定更改为:
data bind=“value:userdata.UserName”
。这将在绑定的
viewModel

var login={}//登录名称空间
//建造师
login.UserData=函数(){
var self=这个;
self.UserName=ko.observable(“”);
self.Password=ko.observable(“”);
};
//视图模型
login.UserVM=函数(){
this.userdata=new login.userdata(),
这个.apiUrl=http://localhost:9090/',
this.authenticate=函数(){
var data=JSON.parse(ko.toJSON(this.userdata));
console.log(数据)
//var service=this.apirl+'/api/Cryptography/Encrypt';
//DBconnection.fetchdata('POST',service,JSON.stringify(data.Password),response,function(){console.log('Cannot fetch data')},null,true);
功能响应(res){
console.log(res)
}
}
}; // 从这里删除()命令
ko.applyBindings(new login.UserVM());/*应用敲除绑定*/

用户名:
密码:

应该是
ko.applyBindings(new login.UserVM())
@adiga我一直在引用这个,UserVM已经在执行了。对不起,我不知道这是一个iife如何在这里使用确定的模块模式?@abhishek抱歉,我不明白“我如何才能返回值”是什么意思。(此外,我还不知道有什么明确的模块模式可以帮助实现这一点)