我从Git下载了代码,这里是链接https://github.com/MikeWasson/LocalAccountsApp
在这个visual studio解决方案中,我们有一个名为app.js的JavaScript文件,其中包含以下代码。
function ViewModel() {
var self = this;
var tokenKey = 'accessToken';
self.result = ko.observable();
self.user = ko.observable();
self.registerEmail = ko.observable();
self.registerPassword = ko.observable();
self.registerPassword2 = ko.observable();
self.loginEmail = ko.observable();
self.loginPassword = ko.observable();
function showError(jqXHR) {
self.result(jqXHR.status + ': ' + jqXHR.statusText);
//self.loginPassword();
}
self.callApi = function () {
self.result('');
var token = sessionStorage.getItem(tokenKey);
var headers = {};
if (token) {
headers.Authorization = 'Bearer ' + token;
}
$.ajax({
type: 'GET',
url: '/api/values',
headers: headers
}).done(function (data) {
self.result(data);
}).fail(showError);
}
self.register = function () {
self.result('');
var data = {
Email: self.registerEmail(),
Password: self.registerPassword(),
ConfirmPassword: self.registerPassword2()
};
$.ajax({
type: 'POST',
url: '/api/Account/Register',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data)
}).done(function (data) {
self.result("Done!");
}).fail(showError);
}
self.login = function () {
self.result('');
var loginData = {
grant_type: 'password',
username: self.loginEmail(),
password: self.loginPassword()
};
$.ajax({
type: 'POST',
url: '/Token',
data: loginData
}).done(function (data) {
self.user(data.userName);
// Cache the access token in session storage.
sessionStorage.setItem(tokenKey, data.access_token);
}).fail(showError);
}
self.logout = function () {
self.user('');
sessionStorage.removeItem(tokenKey)
}
}
var app = new ViewModel();
ko.applyBindings(app);
我无法理解属性如何
self.result, self.registerEmail, self.registerPassword/Password2, self.loginEmail, self.loginPassword
成了方法。因为当我输入" self"然后是一个点,intellisense给出了上面提到的所有" self"属性作为方法。像
self.result(), self.registerPassword()
显然" ko"来自Knockout.js库。
但是当我尝试在我的简单JavaScript代码中模仿它时。它失败了,我知道这样做是不对的
var SomeObj = {
ok : function()
{
var x = 10, y= 10, z;
z = x+ y;
return z;
}
}
function ViewModel()
{
var self = this;
self.result = SomeObj.ok();
function xyz()
{
self.result();
alert(5700);
}
}
var v = new ViewModel();
alert(v.result());
但是对象" self"宣布"结果"作为属性,稍后使用它就像app.js中的方法一样,当我尝试
时 alert(v.result());
警告语句中的它给了我一个例外,但如果我这样做
alert(self.result());
在app.js中,它给了我回复" undefined"但为什么不是我的代码中的异常。
答案 0 :(得分:2)
您在这里看到的问题是,通过使用括号,您将调用SomeObj.ok
方法,而不是将其指定为函数。要将方法存储为函数指针,您应该执行以下操作:
self.result = SomeObj.ok;
在此之后,您将能够使用self.result()
执行指定的方法,该方法将返回指定的SomeObj.ok
方法的结果。
在此检查observable的定义:
它定义了一个函数,该函数返回一个函数,该函数还根据是否发送参数提供读写逻辑。如果您的ok
函数返回了一个函数而不是结果,则可以使用与observable相同的方式访问它。
var SomeObj = {
ok : function() {
return function() {
var x = 10, y= 10, z;
z = x+ y;
return z;
}
}
}
现在,赋值self.result = SomeObj.ok();
将使用函数对self.result进行填充,因此调用self.result()
将调用已分配的函数。