Problem using "dataProvider.removeItem" in actionscript - actionscript-3

I want to remove an item from my dataprovider where the label in dataprovide is "zee4"
I tried:
var removeThis:Object = mylist.dataProvider[selIndex].alias;
mylist.dataProvider.removeItem(removeThis);
But this does not work. I cannot use removeItemAt because I don't know the index number. I need to remove as per the alias itself. The alias is a unique field.

Try this:
var removeThis:Object = mylist.dataProvider[selIndex];
mylist.dataProvider.removeItem(removeThis);
The reason your method is not working, is because removeThis is not an item in dataProvider. Its a property in the item that is in dataProvider.

To remove by value, try iterating through the dataProvider and removing the Item when the comparison in true:
var removeThis:Object = mylist.dataProvider.getItemAt(selIndex).dataValue;
for (var i:int = 0; mylist.dataProvider.length > 0; i++)
{
if (mylist.dataProvider.getItemAt(i).dataValue == removeThis)
{
mylist.dataProvider.removeItemAt(i);
break;
}
}

Related

Can I make an object to repeat in a loop?

My current code look like this:
var that = $(this).closest('tr');
for (var i = 0; i < data.length; i++) {
that.next().find("[name='prod_code']").val(data[i]["prd_code"]);
that.next().find("[name='prod_desc']").val(data[i]["prd_desc"]);
that.next().find("[name='prod_qty']").val(data[i]["prd_qty"]);
}
What it does is to set the value from the array to the input inside a table.
But currently it can only set 1 row with the last element in the array.
I found out that if I add next() function repeatedly it can insert all the product in the table, but it kinda look dumb to do that manually.
My expectation of loop (I have tried but it doesn't work):
var that = $(this).closest('tr');
for (var i = 0; i < data.length; i++) {
var next = "next()";
that.next.find("[name='prod_code']").val(data[i]["prd_code"]);
that.next.find("[name='prod_desc']").val(data[i]["prd_desc"]);
that.next.find("[name='prod_qty']").val(data[i]["prd_qty"]);
next++;
}
Someone please point out what am I missing.
Thanks in advance!!
Given that you have the i index of the row which can be aligned with the index of the object within the array, then you can use eq() to find the tr by that index in order to update the form controls within it:
var $rows = $('#yourTable tbody tr');
for (var i = 0; i < data.length; i++) {
$rows.eq(i).find('[name="prod_code"]').val(data[i]['prd_code']);
$rows.eq(i).find('[name="prod_desc"]').val(data[i]['prd_desc']);
$rows.eq(i).find('[name="prod_qty"]').val(data[i]['prd_qty']);
}
Alternatively you could loop over the tr and use their index to find the object within the array:
$('#yourTable tbody tr').each((i, tr) => {
let $tr = $(tr);
$tr.find('[name="prod_code"]').val(data[i]['prd_code']);
$tr.find('[name="prod_desc"]').val(data[i]['prd_desc']);
$tr.find('[name="prod_qty"]').val(data[i]['prd_qty']);
});

Is using a variable on HTMLElement.style.variable in Angular/TypeScript possible?

I try to implement an updateStyle(...)-method inside of an Angular-Component.
With this method specific elements with unique id's shall be styled.
Following code-snippet leads to:
Property 'variable' does not exist on type 'CSSStyleDeclaration'.
Is it possible to make angular compile anyway, so the variable is filled with a legit value in runtime or do I have to implement the method for every style-declaration, that I am going to use the method on?
updateStyle(id, variable, value){
var components = document.querySelectorAll("[id]") as NodeListOf<HTMLElement>;
for(var i = 0; i < components.length; i++) {
if(components[i].getAttribute("id") == id) {
components[i].style.variable = value;
}}}
You can put variable in square brackets like this:
updateStyle(id, variable, value) {
var components = document.querySelectorAll("[id]") as NodeListOf<HTMLElement>;
for (var i = 0; i < components.length; i++) {
if (components[i].getAttribute("id") == id) {
***components[i].style[variable] = value;***
}
}
}

adding a new row only when the last row in modified

Problem description:
I have a table with three rows. The first row contains a drop down. When a user selects a drop down option, a new row should be generated beneath the current last row. How can I tweak this code to such that a new row is generated only when the user selects a drop down option of the current last row, and not any other row?
JSFiddle: http://jsfiddle.net/JPVUk/13/
var ViewModel = function() {
var self = this;
self.items = ko.observableArray([{comment:'first comment', amount:0}]);
self.addNewItem = function(){
self.items.push(new Item('',0));
};
}
var Item = function(comment, amount) {
var self = this;
self.comment = ko.observable(comment);
self.amount = ko.observable(amount);
};
vm = new ViewModel()
ko.applyBindings(vm);
What I am struggling to do:
So, since I want to bind the change event to the last row, here's how I am approaching it:
<select class="input-small" data-bind="items()[items.length-1] ? event: { change: $root.addNewItem }">
This is however not working. Any ideas folks ?
Can't you just past the row that causes the event to fire to your handler and check it there?
Something like this:
<select class="input-small" data-bind="event: { change: $root.addNewItem }">
And then:
self.addNewItem = function(row){
if (row == self.items()[self.items().length - 1]) {
self.items.push(new Item('',0));
}
};
http://jsfiddle.net/JPVUk/14/
I'm not sure if jQuery was acceptable so this just uses DOM. Basically use the event object passed to knockout. Traverse a little dom and determine is the event target is a child of the last row in the parent table:
var tableRow = event.target.parentNode.parentNode,
body = tableRow.parentNode,
nodes = body.childNodes,
children = [];
for (var i = 0; i < nodes.length; i++) {
// remove non-element node types. ie textNodes, etc.
if (nodes[i].nodeType === 1) {
children.push(nodes[i]);
}
}
if (tableRow === children[children.length - 1]) {
self.items.push(new Item('', 0));
}

how to compare two array collection using action script

how to compare two arraycollection
collectionArray1 = ({first: 'Dave', last: 'Matthews'},...........n values
collectionArray = ({first: 'Dave', last: 'Matthews'},...........n values
how to compare..if equal just alert nochange if not alert chaged
If you just want to know if they are different from each other, meaning by length, order or individual items, you can do the following, which first checks to see if the lengths are different, then checks to see if the individual elements are different. This isn't terribly reusable, it's left as an exercise for the reader to split this apart into cleaner chunks :)
public function foo(coll1:ArrayCollection, coll2:ArrayCollection):void {
if (coll1.length == coll2.length) {
for (var i:int = 0; i < coll1.length; i++) {
if (coll1[i].first != coll2[i].first || coll1[i].last != coll2[i].last) {
Alert.show("Different");
return;
}
}
}
Alert.show("Same");
}
/* elements need to implement valueOf
public function valueOf():Object{}
*/
public static function equalsByValueOf(
first:ArrayCollection,
seconde:ArrayCollection):Boolean{
if((first==null) != (seconde==null) ){
return false;
}else if(!first && !seconde){
return false;
}
if(first.length!=seconde.length){
return false;
}
var commonLength:int = first.length;
var dictionary:Dictionary = new Dictionary();
for(var i:int=0;i<commonLength;i++){
var item1:Object = first.getItemAt(i);
var item2:Object = seconde.getItemAt(i);
dictionary[item1.valueOf()]=i;
dictionary[item2.valueOf()]=i;
}
var count:int = 0;
for (var key:Object in dictionary)
{
count++;
}
return count==commonLength;
}
/* valueOf sample
* something like javaObject.hashCode()
* use non changing fields(recommended)
*/
public function valueOf():Object{
return "_"+nonChangeField1+"_"+nonChangeField2+"...";
}
I was going to say this.
if(collectionArray === collectionArray1)
But that wont work (not triple = signs). As === is used to see classes.
I would write a function called check if object exists in array.
Create an array to hold elements that are not found. eg notFound
in Collection1 go through all the element and see if they exist in Collection2, if an element does not exist, add it to the notFound array. Use the function your created in step1
Now check Collection2, if an element is not found add it to the notFound array.
There is no 5.
Dude, use the mx.utils.ObjectUtil... the creators of actionscript have already thought about this.
ObjectUtil.compare(collection1, collection2) == 0;

post all values in select box /listbox

I have a selectbox on a form - which I've turned in to a list box by putting
<select id="Select1" name="D1" size="5" style="width: 220px">
I'm filling this select/listbox with values...
When I post the form how can I get all the values in the select box..is this possible or am I only able to get one that has been selected.
Trouble is I want all the values in the select (I'm not selecting any as such)
Any ideas?
Before submitting the form you can use some JavaScript to pull the items out of the select and put them into a hidden text field (as a delimited string)
For example, you can get the values using
var select1 = document.getElementById('select1');
var values = new Array();
for(var i=0; i < select1.options.length; i++){
values.push(select1.options[i].value);
}
var allValues = values.join(";");
alert(allValues);
Hope that helps.
How are you adding the values to the list box? Are they static or are they pulled from a database.
If you're pulling from the database I would create a function that you use to get the data and bind to the list box.
Then use that same function when you want to get those values after the post. You may have to use some hidden fields to pass along any parameters you use to get the values for the list box in the first place.
example:
function get_models_for_make(int make_id)
mydata_rs = SELECT name, id FROM models WHERE make_id = make_id
return mydata_rs
end
so you could use this data to bind the objects to your listbox and also use it to get the values later that you did bind to your list box.
for (int i = source.Items.Count - 1; i >= 0; i--)
{
ListItem item = source.Items[i];
if (moveAllItems)
item.Selected = true;
if (item.Selected)
{
// if the target already contains items, loop through
// them to place this new item in correct sorted order
if (target.Items.Count > 0)
{
for (int j = 0; j < target.Items.Count; j++)
{
if (target.Items[j].Text.CompareTo(item.Text) > 0)
{
target.Items.Insert(j, item);
item.Selected = false;
break;
}
}
}
// if item is still selected, it must be appended
if (item.Selected)
{
target.Items.Add(item);
item.Selected = false;
}
// remove the item from the source list
source.Items.Remove(item);
}
}