2013-12-13 11 views
5

Bu jsfiddle İçinde çalışmak istediklerimin basit bir örneğim var. Her şey iyi çalışıyor. Ancak bu dizileri bazı döngülerle veya başka bir şeyle oluşturmanın daha iyi bir yolu olmalı gibi görünüyor. Bütün gün uğraşıyorum ve başaramadım. ben o iş için sırayla gerçekleştirmek için gerekenleri voodoo Gözlemlenebilirliği kurmak için daha iyi bir yol Knockoutjs içinde hesaplanmış nesneler kümesi

  • mümkündür

    1. eğer birisi bana söyleyebilir.

    İşte kemanın kodu.

    Görünüm:

    <table> 
    <tbody> 
        <tr> 
         <td></td> 
         <!-- ko foreach: topvals --> 
         <td > 
          <input type="text" data-bind="value: val"/> 
         </td> 
         <!-- /ko --> 
        </tr> 
        <tr> 
         <td><input type="text" data-bind="value:sidevals()[0].val"/></td> 
         <!-- ko foreach: intersections()[0] --> 
         <td><span data-bind="text: val"></span></td> 
         <!-- /ko --> 
        </tr> 
        <tr> 
         <td ><input type="text" data-bind="value:sidevals()[1].val"/></td> 
         <!-- ko foreach: intersections()[1] --> 
         <td><span data-bind="text: val"></span></td> 
         <!-- /ko --> 
        </tr> 
    </tbody> 
    </table> 
    

    ViewModel:

    function ViewModel() { 
    
        this.topvals = ko.observableArray([ 
         { val: ko.observable(6) }, 
         { val: ko.observable(1) }, 
         { val: ko.observable(1) }, 
         { val: ko.observable(1) } 
        ]); 
    
        this.sidevals = ko.observableArray([ 
         { val: ko.observable(1) }, 
         { val: ko.observable(1) }, 
         { val: ko.observable(1) } 
        ]); 
    
        this.intersections = ko.observableArray([ 
         [ 
          { val: ko.computed(function() { return this.topvals()[0].val() * this.sidevals()[0].val(); }, this) }, 
          { val: ko.computed(function() { return this.topvals()[1].val() * this.sidevals()[0].val(); }, this) }, 
          { val: ko.computed(function() { return this.topvals()[2].val() * this.sidevals()[0].val(); }, this) }, 
          { val: ko.computed(function() { return this.topvals()[3].val() * this.sidevals()[0].val(); }, this) } 
         ], 
         [ 
          { val: ko.computed(function() { return this.topvals()[0].val() * this.sidevals()[1].val(); }, this) }, 
          { val: ko.computed(function() { return this.topvals()[1].val() * this.sidevals()[1].val(); }, this) }, 
          { val: ko.computed(function() { return this.topvals()[2].val() * this.sidevals()[1].val(); }, this) }, 
          { val: ko.computed(function() { return this.topvals()[3].val() * this.sidevals()[1].val(); }, this) } 
         ] 
        ]); 
    } 
    
    ko.applyBindings(new ViewModel()); 
    
  • +0

    Özellikle "kesişme" yi soyutlatabilmem, özellikle topval, yanval ve sabit ile yapılması gereken orta derecede karmaşık bir denklem olduğu için özellikle yararlı olur. Bunu daha önce de anlamadım: -/ – jgonyer

    +0

    Jsfiddle bağımlılıklarına manuel olarak KO eklediğinizden emin olun .. burada hiç çalışmıyor. – user2864740

    cevap

    3
    • sen ko.mapping.fromJS kullanabilirsiniz topvals ve sidevals dizileri yaratmak.
    • Hesaplanan intersections oluşturmak için ko.utils.arrayMap işlevini kullanarak bir dizi dizi döndürebilirsiniz. İşte

    son kodu (ve bir jsfiddle) 'dir:

    function ViewModel() { 
        var self = this; 
    
        var calculateIntersection = function(topval, sideval) { 
         return topval * sideval; 
        }; 
    
        var topvals = [{ val: 1 }, { val: 2 }, { val: 3 }]; 
        var sidevals = [{ val: 1 }, { val: 2 }, { val: 3 }]; 
    
        self.topvals = ko.mapping.fromJS(topvals); 
        self.sidevals = ko.mapping.fromJS(sidevals); 
        self.intersections = ko.computed(function() { 
         return ko.utils.arrayMap(self.sidevals(), function(sideval) { 
          return ko.utils.arrayMap(self.topvals(), function(topval) { 
           return calculateIntersection(topval.val(), sideval.val()); 
          }); 
         }); 
        }); 
    } 
    
    ko.applyBindings(new ViewModel()); 
    

    Ve burada görünümdür:

    Bu basit görünüm model zaten öyle
    <table> 
        <tbody> 
         <tr> 
          <td></td> 
          <!-- ko foreach: topvals --> 
          <td > 
           <input type="text" data-bind="value: val"/> 
          </td> 
          <!-- /ko --> 
         </tr> 
         <!-- ko foreach: sidevals --> 
         <tr> 
          <td><input type="text" data-bind="value: val"/></td> 
          <!-- ko foreach: $root.intersections()[$index()] --> 
          <td><span data-bind="text: $data"></span></td> 
          <!-- /ko --> 
         </tr> 
         <!-- /ko --> 
        </tbody> 
    </table> 
    
    1

    :

    function ViewModel(vals1, vals2) { 
        this.topvals = ko.observableArray(mapToObservables(vals1)); 
        this.sidevals = ko.observableArray(mapToObservables(vals2)); 
        this.calc = function (val1, val2) { 
         return ko.unwrap(val1) * ko.unwrap(val2); 
        }; 
    } 
    
    ko.applyBindings(new ViewModel([6, 5, 4, 3], [1, 2, 3])); 
    

    mapToObservables, eşlemeyi temsil eder eklentisi veya bu gibi bir fonksiyonu:

    function mapToObservables(vals) { 
        return ko.utils.arrayMap(vals, function (val) { 
         return { val: ko.observable(val) }; 
        }); 
    }; 
    

    ve bu görünüm

    <table> 
    <tbody> 
        <tr> 
         <td></td> 
         <!-- ko foreach: topvals --> 
         <td><input type="text" data-bind="value: val"/></td> 
         <!-- /ko --> 
        </tr> 
        <!-- ko foreach: sidevals --> 
        <tr> 
         <td><input type="text" data-bind="value: val"/></td> 
         <!-- ko foreach: $root.topvals --> 
         <td><span data-bind="text: $root.calc(val, $parent.val)"></span></td> 
         <!-- /ko --> 
        </tr> 
        <!-- /ko --> 
    </tbody> 
    </table> 
    

    bakınız: http://jsfiddle.net/dt9kL/

    Bir varyant değerleri için ayrı bir alt-modeli kullanmak olacaktır: http://jsfiddle.net/dt9kL/1/. Tek bir değeri kapsüllemek için bu fazladır, ancak daha karmaşık yapılar için yararlı olabilir.

    İlgili konular