javascript - 在javascript中声明可观察到的动态 knockout

标签 javascript c# asp.net-mvc knockout.js

我正在使用 asp.net mvc 实现 knockout ,我在 asp.net mvc 中有一个 View 模型。我有一个基于 asp.net mvc View 模型中每个类的属性名称的值使用服务器端生成的数组列表。例如:Array[] propertyName = { name1, name2, name3 }。现在我需要使所有这些属性名称都可观察,如下所示。我可以在 javascript 中逐一键入它,但问题是它应该根据 asp.net mvc 中定义的 View 模型中可用的属性是动态的。现在我硬编码 name1, name2, name3 buy 我不知道如何根据从服务器返回的数组使其动态化。

<script>
  function TestViewModel() {
    var self = this;
    self.name1 = ko.observable('@name1') //from view model (need to be dynamic)
    self.name2 = ko.observable('@name2') //from view model (need to be dynamic)
    self.name3 = ko.observable('@name3') //from view model (need to be dynamic)
    
    self.btn1 = ko.observable(false); //hardcoded base on html
    self.btn2 = ko.observable(true); //hardcoded base on html
  }
  
    ko.applyBindings(new TestViewModel());
</script>


// What i expect
<script>
  function TestViewModel() {
    var self = this;
    Array[] propertyName = { name1, name2, name3 } // value retrieve from server
    @foreach(var item in propertyName) {
      // and knockout js can run this
      self.@propertyName = ko.observable(@propertyName)
    }
    
    self.btn1 = ko.observable(false); //hardcoded base on html
    self.btn2 = ko.observable(true); //hardcoded base on html
  }
  
    ko.applyBindings(new TestViewModel());
</script>

// fail because self.@propertyName
self.@propertyName = ko.observable(@propertyName)
= expected identifer
ko expected;

最佳答案

您可以使用 ko.mapping用于根据模型属性创建 ko.observables 的插件。 所以假设,如果您有一个传递给 Razor View 的以下模型

 public class PersonVM
 {
    public int Id { get; set; }
    public String Name { get; set; }
    public String Address { get; set; }
 }

然后您可以将模型序列化为 json 对象并传递给您的 TestViewModel 函数,并使用 ko.mapping.fromJs(data,{},this) 将 C# 模型属性映射到您的客户端 knockout View 模型可观察对象。

<script type="text/javascript">
        function TestViewModel(data) {
            var self = this;
            ko.mapping.fromJS(data, {}, this);
            self.btn1 = ko.observable(false); //hardcoded base on html
            self.btn2 = ko.observable(true); //hardcoded base on html
        }

        var jsonEncodedModel = @Html.Raw(JsonConvert.SerializeObject(Model));
        ko.applyBindings(new TestViewModel(jsonEncodedModel));

</script>

然后您的模型属性 Id、Name、Address 将在您的 TestViewModel 中创建为可观察对象。

关于javascript - 在javascript中声明可观察到的动态 knockout ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32135727/

相关文章:

c# - 将范围为 "request"的对象注入(inject)原型(prototype)对象

c# - Azure 函数 - 获取配置推荐实践

c# - 如何从 MVC Controller 打开新窗口?

javascript - 如何向元素添加新的变换样式?

javascript - ExtJs - Javascript - 网格中的组合框(单元格编辑插件) - 网格/窗口后面的下拉列表

javascript - Facebook:使用图形 API (javascript sdk) 发布多个链接

asp.net-mvc - 静态内容的 MVC 客户端缓存不起作用

javascript - 简单的 JavaScript 映射——使用一个对象作为返回值

c# - 在 C# 中创建数据透视表

c# - 提交表单时如何获取当前 View 的操作名称?