2013-02-11 167 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