【问题标题】:binding an array to a view model using knockout.js使用 knockout.js 将数组绑定到视图模型
【发布时间】:2012-09-08 14:25:09
【问题描述】:

有没有办法定义一个数组并将它绑定到一个视图模型?还是必须将其定义为对象?:

---- js ----

var arr = [{"id":"1","desc":"1","enabled":true,"tabStr":"/2 * * * * * *"}, {"id":"2","desc":"2","enabled":true,"tabStr":"1-60/2 * * * * * *"}, {"id":"3","desc":"3","enabled":false,"tabStr":"/5 * * * * * *"}]; $(文档).ready(函数(){ ko.applyBindings(arr); });

----- html ----

    <tbody data-bind="foreach: ???">
      <tr>
        <td data-bind="text: id"></td>
        <td data-bind="text: desc"></td>
        <td data-bind="text: tabStr"></td>
        <td data-bind="text: enabled"></td>
      </tr> 
    </tbody>

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    如果您不想将数组包装在对象中,则可以使用特殊的上下文变量$data(或$root,因为这是顶级视图模型)来绑定当前数据。所以,你的绑定看起来像:

    <tbody data-bind="foreach: $data">
      <tr>
        <td data-bind="text: id"></td>
        <td data-bind="text: desc"></td>
        <td data-bind="text: tabStr"></td>
        <td data-bind="text: enabled"></td>
      </tr> 
    </tbody>
    

    您可以在此处找到有关上下文变量的更多信息:http://knockoutjs.com/documentation/binding-context.html

    【讨论】:

    • 除非您的数据有更多,否则$root$data 在该顶层对您来说应该是相同的。听起来你已经成功了。
    【解决方案2】:

    我使用 MVC 而不是“arr”,所以我使用Model(我将我的版本保留为“arr”),并在我的视图顶部有一个@using IEnumerable&lt;MyViewModel&gt;,我让控制器执行以下操作:

    public ActionResult Index() {
         var data = myDataContext.SomeTable.Where(e => e.blah == "Foo"); 
         return View(data);
    }
    

    这会返回类似于您的 arr 的内容,所以我认为下面的代码应该适合您:

    <table border="1" width="100%" data-bind="foreach: mainArray">
        <tr>
            <td width="25%">ID</td>
            <td width="25%">Desc</td>
            <td width="25%">Enabled</td>
            <td width="25%">TabStr</td>
        </tr>
        <tr>
            <td width="25%" data-bind="text: id"></td>
            <td width="25%" data-bind="text: desc"></td>
            <td width="25%" data-bind="text: tabStr"></td>
            <td width="25%" data-bind="text: enabled"></td>
        </tr> 
    </table>
    <script language="type/Javascript">
        var arr = [{"id":"1","desc":"1","enabled":true,"tabStr":"2"},
            {"id":"2","desc":"2","enabled":true,"tabStr":"1-60"},
            {"id":"3","desc":"3","enabled":false,"tabStr":"5"}];
        //var arr = [@Html.Raw(Json.Encode(Model))][0];
    
        $(function () {
    
             var myViewModel = new MyViewModel(arr);
             ko.applyBindings(myViewModel);
    
             function MyViewModel(arr) {
                 var self = this;
                 self.mainArray = ko.observableArray([]);
    
                 if (arr.length > 0) {
                     for (var i=0; i<arr.length; i++) {
                         var myDataViewModel = new MyDataViewModel(arr[i]);
                         self.mainArray.push(myDataViewModel);
                     } 
                 }
             }
    
             function MyDataViewModel(vm) {
                //alert(vm.id);
                var self = this;
                if (vm != null) {                     
                   self.id = ko.observable(vm.id);
                   self.desc = ko.observable(vm.desc);
                   self.enabled = ko.observable(vm.enabled);
                   self.tabStr = ko.observable(vm.tabStr);
               } else {
                  self.id = 0;
                  self.desc = 0;
                  self.enabled = true;
                  self.tabStr = 0;
               }
            }
         });
    
    </script>
    

    在这里工作的 JSFiddle:http://jsfiddle.net/navyjax2/y75hcr2L/

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 2014-04-02
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多