javascript – 为什么knockout.mapping在某些数据结构上失败?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 为什么knockout.mapping在某些数据结构上失败?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3243字,纯文字阅读大概需要5分钟。
内容图文
使用knockout.mapping我尝试从JSON映射到ko-object.当尝试使用带有映射选项的更高级解决方案时,我常常遇到Uncaught TypeError:g不是函数.我试图弄清楚什么是问题,但我仍然感到困惑.
可以说我有一个非常简单的模型:
var data1 = { // works
a: "a",
b: [
{ b1: "v1" },
{ b2: "v2" }
]
};
现在使用这个模型就像这样:
function viewModel ( data ) {
var self = this;
var a = ko.mapping.fromJS( data, { observe: "a"} );
return a;
}
var vm1 = viewModel( data1 ); // works
我的模型中有两个属性(a和b),但我只需要一个是可观察的,而b应该只是复制到viewmodel.
遗憾的是,如果数据结构变得更深,它就不会那么好用:
var data1 = { // works
a: "a",
b: [
{ b1: "v1" },
{ b2: "v2" }
]
};
var data2 = { // Uncaught TypeError: g is not a function
a: "a",
b: [
{ b1: { name: "v1" } },
{ b2: { name: "v2" } }
]
};
var data3 = { // Uncaught TypeError: g is not a function
a: "a",
b1: { name: "v1" },
b2: { name: "v2" }
};
var data4 = { // works
a: "a",
b1: "v1",
b2: "v2"
};
var data5 = { // works
a: "a",
b1: ["1::v1", "2::v1"],
b2: ["1::v2", "2::v2"]
};
function viewModel ( data ) {
var self = this;
var a = ko.mapping.fromJS( data, { observe: "a"} );
return a;
}
var vm1 = viewModel( data1 ); // works
var vm2 = viewModel( data2 ); // Uncaught TypeError: g is not a function
var vm3 = viewModel( data3 ); // Uncaught TypeError: g is not a function
var vm4 = viewModel( data4 ); // works
var vm5 = viewModel( data5 ); // works
复制一些结构工作而不是其他工作似乎令人费解.我明白,当树中的某个地方存在多级哈希时,问题会跳进去.
这是期望的行为还是我在这里做错了什么?为什么复制某些结构而不是其他?
解决方法:
我成功地再现了你提到的问题:
var data1 = { // works
a: "a",
b: [
{ b1: "v1" },
{ b2: "v2" }
]
};
var data2 = { // Uncaught TypeError: g is not a function
a: "a",
b: [
{ b1: { name: "v1" } },
{ b2: { name: "v2" } }
]
};
function viewModel ( data ) {
var self = this;
var a = ko.mapping.fromJS( data, { observe: ["a"]} );
return a;
}
var vm1 = viewModel( data1 ); // works
var vm2 = viewModel( data2 ); // Uncaught TypeError: g is not a function
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-debug.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script>
正如您所看到的,在我的repro中,我包含了两个库的非缩小版本.我在错误中介入它,它就在这里,在这段代码中:
if(options.observe.length > 0 && ko.utils.arrayIndexOf(options.observe, fullPropertyName) == -1)
{
mappedRootObject[indexer] = value(); // <---- THIS LINE
options.copiedProperties[fullPropertyName] = true;
return;
}
这条线让我感到奇怪,因为通常使用KO,如果你不确定它们是普通值还是可观察值,你需要明确地需要“展开”值.
所以我去了the relevant source code on Github,但令我惊讶的是,CDNJS版本的上述代码不存在,它有所不同:
if(options.observe.length > 0 && ko.utils.arrayIndexOf(options.observe, fullPropertyName) == -1)
{
mappedRootObject[indexer] = ko.utils.unwrapObservable(value); // <-- DIFFERENT
options.copiedProperties[fullPropertyName] = true;
return;
}
这条线是我期望它的方式.
然后,the most recent debug build又一次有了bug /第一版.
然后再挖一些,我看到issue #137就是这个问题.这个问题以我得出的相同结论结束:修复程序未包含在2.4.1版本中.不太可能很快会出现新版本:正如您在the project’s readme中所看到的,此项目目前尚未得到积极维护.
结论:您需要解决这种情况,或者修复此问题的自定义构建版本.
内容总结
以上是互联网集市为您收集整理的javascript – 为什么knockout.mapping在某些数据结构上失败?全部内容,希望文章能够帮你解决javascript – 为什么knockout.mapping在某些数据结构上失败?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。