2015-10-06 25 views
0

我有我持有一个JSON对象与结构的ko.observable:叠代的JSON对象

{ 
"abc": {}, 
"zdc": {} 
} 

我怎么能遍历这个基因敲除使用的foreach?直到现在,我设法遍历键(“abc”,“zdc”),但我不知道如何使用键从可观察值中获取值。

这里是我的代码

<div data-bind="foreach: { data: Object.keys(copyProgStats2()), as: 'item' }"> 
         <ul> 
          <li> 
           <span data-bind="text: item"></span> 
          </li> 
         </ul> 
        </div> 

其中copyProgStats2是保存JSON obj中的ko.observable。

在这种情况下,我不使用可观察数组非常重要,因为这会让更多事情变得更难。

回答

1

你可以这样做:$parent.copyProgStats2()[item],一起来看看:

function AppViewModel() { 
 
    this.copyProgStats2 = ko.observable({ 
 
     "abc": 'cool', 
 
     "zdc": 'good enough' 
 
    }); 
 
} 
 

 
ko.applyBindings(new AppViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<div data-bind="foreach: { data: Object.keys(copyProgStats2()), as: 'item' }"> 
 
    <ul> 
 
    <li> 
 
     <span data-bind="text: $parent.copyProgStats2()[item]"></span> 
 
    </li> 
 
    </ul> 
 
</div>

1

任何但是最简单的操作你的数据在视图模型更好地完成,让您的观点,从复杂和混乱。一个小的辅助功能可以处理将可观察对象转换为适合于foreach的数组。

我向对象添加了延迟更改,因此您可以看到它将在视图中更新。我不得不使用valueHasMutated,因为我所做的更新并不是一个观察者可以注意到的事情。

function AppViewModel() { 
 
    this.copyProgStats2 = ko.observable({ 
 
    "abc": 'cool', 
 
    "zdc": 'good enough' 
 
    }); 
 
    this.toArray = function(observableObject) { 
 
    var obj = observableObject(); 
 
    return ko.utils.arrayMap(Object.keys(obj), function(key) { 
 
     return obj[key]; 
 
    }); 
 
    }; 
 
} 
 
vm = new AppViewModel(); 
 
ko.applyBindings(vm); 
 

 
setTimeout(function() { 
 
    vm.copyProgStats2().extra = 'new'; 
 
    vm.copyProgStats2.valueHasMutated(); 
 
}, 1500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<div data-bind="foreach: toArray(copyProgStats2)"> 
 
    <ul> 
 
    <li> 
 
     <span data-bind="text: $data"></span> 
 
    </li> 
 
    </ul> 
 
</div>