2013-02-11 166 views
4

我想做可觀察對象的可觀察對象。例如:KnockoutJS可觀察對象的可觀察對象

 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)); 
      ... 
      } 

事情是這樣的......我想newUpProject可觀察到和它的屬性是可觀。我也試過this.newUpProj = ko.mapping.fromJS(new Project());

EDIT1:它包裝箱對象,但它的屬性(ID,姓名...)不可觀測量...

EDIT2:使用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> 

正確的價值觀被加載到輸入和選擇中,但如果輸入爲空(例如),保存按鈕從不會被禁用,因爲更改不會進入模型。

+0

你能發佈html嗎? – 2013-02-11 15:27:28

回答

5

管理這個做到這一點: 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> 

臨屋尋求幫助。

+1

這行'model.data.valueHasMutated()'會做什麼? – Mou 2015-05-29 14:12:58

5

可能只是需要在你綁定中執行你的newUpProj?

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

如果做不到這一點,你可以嘗試做被設置爲根據CUSTID的狀態和名稱true或false一個計算觀察到的

+0

不,試了一下。感謝您的答案... – 2013-02-11 19:43:59

+0

可能是計​​算observable將解決特定情況下,但我將需要在其他情況下... – 2013-02-11 19:46:47

+0

@Evgeny可能試圖充分聲明條件?所以像'if newUpProj.name()!==「」' – Thewads 2013-02-12 09:45:23