Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Durandal Viewmodel未返回淘汰映射对象_Javascript_Mvvm_Knockout.js_Durandal - Fatal编程技术网

Javascript Durandal Viewmodel未返回淘汰映射对象

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

我计划使用Knockout映射插件将ajax调用返回的数据映射到Durandal框架下的viewmodel。但是,我不知道如何返回映射对象,以便视图可以使用它。以下是我的viewmodel login.js代码:

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
希望这能帮助那些和我遇到同样问题的人。干杯