2014-10-08 64 views
1

我在触发器中触发订阅事件时遇到了一些麻烦。我有一组Schema,每个Schema都持有若干天。我想在一天的时间戳发生变化时触发我的订阅事件,而不仅仅是当架构数组发生更改时。在Knockout JS中为儿童属性触发订阅事件

这是我的代码到目前为止。当架构添加到架构阵列或从架构阵列中移除时,底部的订阅事件触发。但是,当任何儿童属性发生变化时并非如此

{"schemas":[ 
    {"days":[ 
     {"from":"12:00","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     ... 
    ]}, 
    {"days":[ 
     {"from":"06:30","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     ... 
    ]} 
]} 

var Schema = function(data, parent, index) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 
}; 

var SchemaViewModelMapping = new (function() { 
    var self = this; 

    self.index = 0; 
    self.schemas = { 
     create: function(options) { 
      self.index++; 
      return new Schema(options.data, options.parent, self.index); 
     } 
    }; 
    self.index = 0; 
})(); 


var SchemaViewModel = function() { 
    ko.mapping.fromJS(data, SchemaViewModelMapping, self); 

    self.schemas.subscribe(function(value) { 
     **Let me do something when a DAY changes here!!!** 
    }); 
} 

var ViewModel = new SchemaViewModel; 
ko.applyBindings(ViewModel); 
+2

'schemas' observable不知道数组内容的内部 - 只有数组本身的内容。要做你的建议,你需要使数组中每个项目的每个属性都是一个'observable'或'observableArray',并订阅这些以查看任何更改 – 2014-10-08 09:28:29

+0

谢谢..这很有道理。我能解决它。 – Stromgren 2014-10-08 10:46:36

+1

请将其添加为答案,并将其标记为帮助其他人的有效答案。 – JotaBe 2014-10-10 09:32:48

回答

1

继@JamesThorpe的建议,我更新了我的代码如下:
我已经添加了从那里添加我的订阅,这是我从架构实例化新的一天的对象。

{"schemas":[ 
    {"days":[ 
     {"from":"12:00","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     ... 
    ]}, 
    {"days":[ 
     {"from":"06:30","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     {"from":"06:30","to":"17:00"}, 
     ... 
    ]} 
]} 

var Day = function(data) { 
    var self = this; 
    self.from = ko.observable(data.from); 
    self.to = ko.observable(data.to); 
    self.from.subscribe(function() { 
     **Doing my subscribe magic...** 
    }); 
    self.to.subscribe(function() { 
     **Doing my subscribe magic...** 
    }); 
}; 

var Schema = function(data, parent, index) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 
    self.days = ko.observableArray(); 
    data.days.forEach(function(day) { 
     self.days.push(new Day(day)); 
    }); 
}; 

var SchemaViewModelMapping = new (function() { 
    var self = this; 

    self.index = 0; 
    self.schemas = { 
     create: function(options) { 
      self.index++; 
      return new Schema(options.data, options.parent, self.index); 
     } 
    }; 
    self.index = 0; 
})(); 


var SchemaViewModel = function() { 
    ko.mapping.fromJS(data, SchemaViewModelMapping, self); 

    self.schemas.subscribe(function(value) { 
     **Let me do something when a DAY changes here!!!** 
    }); 
} 

var ViewModel = new SchemaViewModel; 
ko.applyBindings(ViewModel);