2012-06-13 6 views
2

Quelle est la méthode suggérée pour lier à des données statiques existantes? Je dois l'inclure dans le viewmodel car il est utilisé dans les valeurs calculées.knockout.js lier à des données statiques

http://jsfiddle.net/z2ykC/4/

<div id="sum" data-bind="text: sum"> 
</div> 
<div class="line"> 
    dynamic: <span data-bind="text: dynamicValue"></span> 
    static: <span data-bind="text: staticValue">312</span> 
    <button data-bind="click: getDataFromServer">get data</button> 
</div> 
<div class="line"> 
    dynamic: <span data-bind="text: dynamicValue"></span> 
    static: <span data-bind="text: staticValue">123</span> 
    <button data-bind="click: getDataFromServer">get data</button> 
</div> 

function SumViewModel(lines){ 
    this.sum = ko.computed(function(){ 
     var value = 0; 
     $.each(lines, function(index, element){ 
      var staticValue = element.staticValue(); 
      if (staticValue) 
       value += staticValue; 
      var dynamicValue = element.dynamicValue(); 
      if (dynamicValue) 
       value += dynamicValue; 
      value += dynamicValue; 
     }); 
     return value; 
    }); 
} 

function LineViewModel() { 

    this.randomNumber = function(max) { 
     return Math.floor((Math.random() * max) + 1); 
    }; 

    this.dynamicValue = ko.observable(0); 
    this.staticValue = ko.observable(); 

    this.getDataFromServer = function() { 
     this.dynamicValue(this.randomNumber(300)); 
    }; 

}; 

var lines = []; 
$('.line').each(function(index, element) { 
    var line = new LineViewModel() 
    //line.staticValue(parseInt($('[data-bind*="staticValue"]', element).text())); 
    lines.push(line); 
    ko.applyBindings(line, element); 
}); 
var sum = new SumViewModel(lines); 
ko.applyBindings(sum, $('#sum')[0]); 

Répondre

2

Vous pouvez chercher à créer une liaison personnalisée, qui initialiser le staticValue observable. Voici un violon de travail:

http://jsfiddle.net/z2ykC/6/

+0

Merci de m'indiquer dans cette direction! Que pensez-vous de cela: http://jsfiddle.net/z2ykC/7/ – MatteS

+0

Ok ... si vous voulez vraiment que la valeur soit lue dans innerText voici quelques réglages. 1) J'utilise maintenant le paramètre de chaîne envoyé à la liaison staticText pour définir dynamiquement cette propriété sur viewModel. 2) Je fais l'analyse à l'intérieur de la reliure, au lieu de la somme. 3) J'ai utilisé jQuery pour accéder au texte, car .innerText ne fonctionne pas dans FireFox. 4) staticValue n'a plus besoin d'être observable. http://jsfiddle.net/z2ykC/9/ –

+0

peut-être que cela sort de la portée, mais comment puis-je faire en sorte que la nouvelle liaison fonctionne avec des champs ainsi que des observables? – MatteS

1

Votre opinion est inefficace, mieux utiliser le foreach liant pour rendre les lignes. Si vous avez besoin de données dans le viewmodel, il appartient au viewmodel, ou doit être récupéré sur le serveur. Ne mettez pas dans la vue et extrayez-le.

function SumViewModel(lines) { 
    // ... 
    this.lines = lines; 
} 

function LineViewModel(staticValue) { 
    // ... 
    this.staticValue = ko.observable(staticValue); 
} 

var staticValues = [312, 123]; 
var lines = []; 

$.each(staticValues, function(index, value) { 
    lines.push(new LineViewModel(value)); 
}); 

ko.applyBindings(new SumViewModel(lines)); 

http://jsfiddle.net/z2ykC/5/

+0

oui, même si je suis d'accord que ce serait optimale, je n'ai pas cette option en ce moment. C'est de loin pas l'option la plus facile non plus. – MatteS

Questions connexes