我有很多(KnockOut)视图模型从休息服务中获取数据,然后填充" item"查看非常简单的模型,只包含来自REST接口的字段。
我只是想知道是否有办法不必定义项目视图模型,但不知何故只是将它们创建为动态对象(其中每个属性都是可观察的)。
所以在下面的例子中,我希望没有" ItemViewModel"但只是在AddItems函数中说它应该根据数据创建一个对象,并使每个条目成为ko.observable。传递的" itemName"然后包含" ItemViewModel1" (或在其他电话" ItemViewModel2" ......等)。
所以,例如如果Json Rest输入有一个字段" LAST_NAME"它会添加self.LAST_NAME = ko.observable()"填充了那个值等(所以我仍然可以在视图中引用它。)
filename <- paste0("R:/path/independeR_", versions, ".zip")
cmd <- file.path(gsub("//networkpath/home/[[:alnum:]]*/", "H:/",
gsub("//networkpath/home/[[:alnum:]]*~[[:alnum:]]*/",
"H:/", R.home())), "bin/x64/R")
libname <- gsub("\\\\\\\\networkpath/home/[[:alpha:]]*/",
"H:/", .libPaths()[1])
call <- paste(paste0('"', cmd, '"'),
"CMD",
"INSTALL",
"-l",
paste0('"', libname, '"'),
"--no-lock",
paste0('"', filename, '"'),
sep = " ")
system(call)
答案 0 :(得分:1)
您可以尝试使用映射插件或Json函数,具体取决于您要查找的内容。我认为你要找的是映射插件:
答案 1 :(得分:1)
有。如果您的对象很简单而不是嵌套,您可以编写代码来自己映射它们:
var someJSON = '{ "firstName": "John", "lastName": "Doe" }';
var makeSimpleVM = function(obj) {
// Return a new object with all property
// values wrapped in an observable
return Object
.keys(obj)
.reduce(function(vm, key) {
vm[key] = ko.observable(obj[key]);
return vm;
}, {});
};
var myVM = makeSimpleVM(JSON.parse(someJSON));
console.log(ko.isObservable(myVM.firstName)); // true
console.log(myVM.firstName()); // John
myVM.firstName("Jane");
console.log(myVM.firstName()); // Jane
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
我认为阅读这个天真的实现很重要:它让你理解为什么使用现成的插件可能是个更好的主意。
只要您的服务器端代码包含数组,嵌套视图模型或您不希望映射的任何属性,您就会遇到问题。 ko.mapping
插件已经为您解决了这些问题。它将数组映射到ko.observableArray
,并允许您指定映射策略。
var someJSON = '{ "firstName": "John", "lastName": "Doe" }';
// Let's use the library this time
var myVM = ko.mapping.fromJS(JSON.parse(someJSON));
console.log(ko.isObservable(myVM.firstName)); // true
console.log(myVM.firstName()); // John
myVM.firstName("Jane");
console.log(myVM.firstName()); // Jane
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>