2013-02-11 2 views
4

Je veux faire un objet observable des observables. Par exemple:KnockoutJS Objet observable des observables

 var Project = function(id, name, custId) { 
      this.id = ko.observable(id); 
      this.name = ko.observable(name); 
      this.custId = ko.observable(custId); 
     } 

     var viewModel = function() { 

        this.newUpProj = ko.observable(new Project(null,null,null)); 
      ... 
      } 

Quelque chose comme ça ... Je veux newUpProject pour être observable et ses propriétés soient observables. J'ai aussi essayé this.newUpProj = ko.mapping.fromJS(new Project());

Edit1: Il crates l'objet, mais ses propriétés (id, nom ...) ne sont pas ... OBSERVABLES

Edit2: Utilisation dans le html:

<div class="modal-body"> 
       <p><input type="text" id="projNameTx" data-bind="value: newUpProj.name()" /></p><br> 
       <p><select data-bind="options: customers, optionsCaption: 'Choose...', value: newUpProj.custId(), optionsText: 'name', optionsValue: 'id'" 
        size="1"></select></p> 

      </div> 
      <div class="modal-footer"> 
       <button class="btn" data-bind="click: clearModal" aria-hidden="true">Close</button> 
       <button class="btn btn-primary" data-bind="click: updateFlag() ? updateProject : addProject, enable: newUpProj.custId() && newUpProj.name()">Save</button> 
      </div> 

valeurs correctes sont chargés dans l'entrée et le select mais le bouton Save ne désactive jamais si l'entrée est vide (par exemple), car le changement ne va pas au modèle.

+0

Pouvez-vous également publier le code html? –

Répondre

5

réussi à faire calculé avec ceci: http://jsfiddle.net/wF7xY/1/

var Model = function() { 
    this.data = ko.observable({}); // It doesn't work 
}; 

var Data = { 
    field1: 'test1', 
    field2: 'test2' 
}; 

var model = new Model(); 
ko.applyBindings(model); 

ko.mapping.fromJS(Data, {}, model.data); 
model.data.valueHasMutated(); 

HTML:

<div data-bind="text: data().field1 ? data().field1() : ''"></div> 

Tha nks pour l'aide.

+1

que fera cette ligne 'model.data.valueHasMutated()'? – Mou

5

Peut-être juste besoin d'exécuter votre nouveauUpProj dans votre liaison?

enable: newUpProj().custId() && newUpProj().name() 

A défaut, vous pouvez essayer de faire une observable qui est définie sur true ou false selon l'état de custID et le nom

+0

Non, je l'ai essayé. Merci pour la réponse ... –

+0

Peut être l'observable calculé permettra de résoudre le cas particulier, mais je vais avoir besoin dans d'autres cas ... –

+0

@Evgeny peut-être essayer de déclarer complètement les conditions? Donc, quelque chose comme 'if newUpProj.name()! ==" "' – Thewads

Questions connexes