knockout.js - How to create an observableArray "before push" subscription? -


i'm trying track down why i'm getting duplicate entries in observablearray. there way subscribe see before item added observable array? can see after item added using subscription like:

var myarr = ko.observablearray(); myarr.subscribe(function (changes) {     changes.foreach(function (change) {         var item = change.value;         var itemstatus = change.status;         if (itemstatus === "added") {          } else if (itemstatus === "deleted") {          }     }); }, null, "arraychange"); 

tl;dr: can use signature myarray.subscribe(func, null, "beforechange").


an observablearray observable properties, subscribe features work normally. the relevant docs:

the subscribe function accepts 3 parameters: callback function called whenever notification happens, target (optional) defines value of this in callback function, , event (optional; default "change") name of event receive notification for.

...

if want notified of value of observable before changed, can subscribe beforechange event.

here's example:

var viewmodel = function() {    var self = this, = 1;        self.items = ko.observablearray([i++, i++, i++]);          self.additem = function() { self.items.push(i++); };        self.items.subscribe(function(oldvalue) {      alert("changed from: " + ko.tojson(oldvalue));    }, null, "beforechange");        self.items.subscribe(function(newvalue) {      alert("changed new value: " + ko.tojson(newvalue));    });  };    ko.applybindings(new viewmodel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>  <button data-bind="click: additem">add item</button>  <ul data-bind="foreach: items"><li data-bind="text: $data"></li></ul>


Comments