Javascript Durandal Viewmodel未返回淘汰映射对象
我计划使用Knockout映射插件将ajax调用返回的数据映射到Durandal框架下的viewmodel。但是,我不知道如何返回映射对象,以便视图可以使用它。以下是我的viewmodel login.js代码:Javascript Durandal Viewmodel未返回淘汰映射对象,javascript,mvvm,knockout.js,durandal,Javascript,Mvvm,Knockout.js,Durandal,我计划使用Knockout映射插件将ajax调用返回的数据映射到Durandal框架下的viewmodel。但是,我不知道如何返回映射对象,以便视图可以使用它。以下是我的viewmodel login.js代码: define(function (require) { var system = require('durandal/system'), app = require('durandal/app'), ko = require('knock
define(function (require) {
var system = require('durandal/system'),
app = require('durandal/app'),
ko = require('knockout'),
komapping = require('komapping'),
deferred = $.Deferred(),
loginOptionsUrl = '/json/loginOptions.json',
loginInterfaceData = {};
ko.mapping = komapping;
return {
activate: function(){
var request = $.getJSON(loginOptionsUrl)
.done(function(data){
loginInterfaceData = ko.mapping.fromJS(data);
system.log(loginInterfaceData); //Do a check here; loginInterfaceData contains all the right data
deferred.resolve();
});
return deferred.promise();
},
loginInterfaceData: loginInterfaceData; //However, the view gets an empty object
如您所见,从ko.mapping返回的对象被分配给loginInterfaceData,我将其返回到视图。但是,当我在Web检查器下检查“viewmodels/login”返回的loginInterfaceData对象时,它是一个空对象。我能想到的唯一理由是viewmodel在映射完成之前返回LoginInterface数据。然而,我不知道如何防止这种情况发生
任何想法/建议都将不胜感激。提前谢谢 之所以会发生这种情况,是因为您返回了对内部loginInterfaceData的引用,但在activate函数中您重新分配了该变量,因此以前返回的loginInterfaceData将始终是空对象。您可以为LoginInterface数据返回一个getter函数,如下所示:
...
getLoginInterfaceData: function() {
return loginInterfaceData;
}
...
在调用代码中,激活完成后,只需调用getLoginInterfaceData。
下面是一个简单的例子:
函数foo{
var bar={};
返回{
挫折:functionx{
bar=x;
},
酒吧:酒吧,,
getBar:函数{
返回杆;
}
}
}
var f=foo;
f、 挫折5;
console.logf.bar;//记录空对象
console.logf.getBar;//记录内部foo.bar的值显然,问题在于在调用activate函数之前返回loginInterfaceData对象,导致视图接收原始的空对象。我的解决方案是首先将LoginInterface数据绑定到空数据,然后在通过Ajax接收到数据后更新它。像这样:
(...)
ko.mapping = komapping;
loginInterfaceData = ko.mapping.fromJS({}); //instead of assigning loginInterfaceData = {}, I use KO Mapping with an ampty JSON object
(...)
return {
activate: function(){
return $.ajax({
url: loginOptionsUrl,
contentType: 'application/json',
}).done(function(data) {
ko.mapping.fromJS(data, loginInterfaceData);//so here, instead of mapping for the first time, I remap/update it
});
},
loginInterfaceData: loginInterfaceData; //at this point, loginInterfaceData is still empty object but will be updated/remap once ajax call is successful
希望这能帮助那些和我遇到同样问题的人。干杯