2014-10-08 68 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);