2013-03-05 46 views
0

例如,到KnockoutJS脚本多个引用打破了标准行为

  1. 我有哪里KO已经被注册的页面,并有一个与观察到的财产“someProperty”一个视图模型;
  2. 我通过ko.isObservable(viewmodel.someProperty)检查“someProperty”是可观察属性 - 它返回'true';
  3. 我做ajax调用以获得一些html标记,其中KO也被注册了;
  4. 现在,如果您检查ko.isObservable(viewmodel.someProperty),它将返回false;

另外所有手动添加的KO扩展名都会丢失。它看起来像jQuery中的bug(或功能)(http://bugs.jquery.com/ticket/10066)。

var viewModel = new function() { 
      var self = this; 
      this.serverData = { 
       Controller: ko.observable(null), 
       Enabled: ko.observable(false), 
       Id: ko.observable(null), 
       ParentId: ko.observable(null), 
       Title: ko.observable(null), 
       MaterialId: ko.observable(null), 
       Alias: ko.observable(null) 
      }; 
      this.treeData = { 
       tree: ko.observable(null), 
       node: ko.observable(null) 
      }; 
      this.submit = submit; 
      this.cancel = cancel; 
      this.openMaterials = menuOptions.openMaterials; 
} 

// ... 
var data = ko.utils.createUnobservable(viewModel.serverData); 
// ... 

(function(ko) { 
    ko.utils = ko.utils || {}; 

    ko.utils.createUnobservable = function(observable) { 
     var unobservable = {}; 
     (function() { 
      for (var propertyName in observable) { 
       var observableProperty = observable[propertyName]; 
       if (ko.isObservable(observableProperty) /* always 'false' after ajax */) { 
        unobservable[propertyName] = observableProperty(); 
       } 
      } 
     })(); 

     return unobservable; 
    }; 

})(ko = ko || {}); 

回答

0

你可以通过保存ko全局变量的副本,你包括加载的AJAX前,然后还原它以后解决这个问题。

var savedKo = window.ko; 
.... // do the ajax thing 
window.ko = savedKo; 
+0

感谢您的回答。很明显,我已经考虑过了,但是这是一种解决方法。但无论如何,这是参考脚本库的正常行为吗? – SamousPrime 2013-03-05 21:31:53

+0

我认为这是正常行为。 – 2013-03-06 00:51:39