动态项目ViewModel Knockout

时间:2017-04-25 10:45:27

标签: javascript knockout.js viewmodel

我有很多(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)

2 个答案:

答案 0 :(得分:1)

您可以尝试使用映射插件或Json函数,具体取决于您要查找的内容。我认为你要找的是映射插件:

http://knockoutjs.com/documentation/plugins-mapping.html

http://knockoutjs.com/documentation/json-data.html

答案 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>