2016-05-31 4 views
0

Update Set - Weitere Informationen unterEmber: ein Wert zurückgeben oder ein Modell Eigentum von Ember Versprechen

Wenn ich ein Versprechen habe, ist es möglich, einen Wert von ihr zurück?

Wenn ich versuche, das itemData-Array zurückzugeben, nachdem das Versprechen aufgelöst wurde, werde ich undefiniert.

Alternativ (und vorzugsweise) Ich möchte in der Lage sein, ein Modell Eigenschaft zu setzen, wenn das Versprechen gelöst hat:

// component code 

itemData:null, 
init() { 
    let model = this.get('data'); 
    model.data.get('products').then(relatedItems => { 
    relatedItems.forEach(function(item,index) { 
     this.set('itemData',item); 
    }); 
    },reject => { 
    console.log('error'); 
    }); 
} 

Der Grund für all dies ist, dass ich die Produkt-Elemente sortieren muß die Ich kann nur über das Versprechen (in diesem Beispiel) zugreifen. Nachdem die itemData Eigenschaft Ich beabsichtige, wie etwas zu tun:

sortedItems:computed.sort('itemData','sortProperties'), 
sortProperties:['name:desc'] 

Weitere Informationen:

In meinem Produkt Route, product.items.item habe ich eine Paginierung Komponente

{{pagination-item-trad data=model}} 

Das Modell hook in der Route product.items.item ist

model(params) { 
    let itemModel = this.store.findRecord('product',params.id); 
    let mainModel = this.modelFor('product.items'); 

    return Ember.RSVP.hash({ 
     data:itemModel, 
     mainData:mainModel 
    }); 
} 

Das mainModel enthält das Kategoriemodell für diesen bestimmten Produktartikel.

Da das Produktkategoriemodell eine Viele-zu-Viele-Beziehung zu Produkten hat, muss ich mithilfe einer Zusage auf die Produktdaten in meiner Komponente zugreifen, was kein Problem war, bis ich die Produktdaten sortieren musste. Ich versuche, die Produktinformationen aus dem Versprechen (itemData unten) zu erhalten und dann in der berechneten Eigenschaft zu verwenden. Also die Frage ist, wie kann ich die Daten aus dem Versprechen für die Verwendung an anderer Stelle im Code extrahieren? Gibt es einen besseren Weg, dies zu erreichen? Ich hoffe, das ist klarer!

sortedItems:computed.sort('itemData','sortProperties'), 
sortProperties:['name:desc'] 

Die Komponente im Detail:

import Ember from 'ember'; 
const {computed} = Ember; 

export default Ember.Component.extend({ 
    itemData:null, // i would like to set this within the promise 
    sortedItems:computed.sort('itemData','sortProperties'), 
    sortProperties:['name:desc'], 
    init() { 
    let allData = this.get('data'); 
    let mainModel = allData.mainData; 
    var self = this; 
    let itemData = []; 
    mainModel.data.get('products').then(relatedItems => { 
     relatedItems.forEach(function(item,index) { 
     console.log(item.get('name')); // prints Product 1 etc etc 
     itemData.pushObject(item); 
    }); 
    self.set('itemData',itemData); // I can't do this 
    },reject => { 
     console.log('error '+reject); 
    }); 
    } 
    // rest of code omitted for brevity 
}); 
+0

Es gibt einen Tippfehler in Zeile 5, fehlende "'": 'let model = this.get (' data ^);' – Pavol

+0

Können Sie eine berechnete Eigenschaft abhängig vom Modell festlegen? 'sortiert: Ember.computed ('data.model.products', function() { Rückgabe this.get ('data.model.products'). Filter (...); });' – Pavol

+0

Es wird nicht arbeiten, da er Versprechungen verwendet. –

Antwort

0

Ihr Umfang ist falsch in Ihrem forEach, this nicht mehr auf Ihre Komponente. Sie können entweder einen anderen Fettpfeil verwenden oder eine Referenz auf den Komponentenbereich mithilfe einer Variablen beibehalten.

Darüber hinaus bezweifle ich, dass Sie itemData bei jeder Iteration zu iterieren und zu überschreiben.

+0

Hallo Kingpin, vielen Dank für Ihre Rückkehr. Entschuldigung - ja, ich wollte versuchen, itemData außerhalb der forEach-Schleife zu setzen! Ich habe einige Anpassungen vorgenommen, kämpfe aber immer noch um das gewünschte Ergebnis. Wenn ich versuche, itemData an anderer Stelle im Code (zur Verwendung in der berechneten Eigenschaft) zu bekommen, werde ich immer noch undefiniert? – Newfoundland

+0

Wo sonst verwenden Sie es, ich sehe nur die Art, sind Sie sicher, das Versprechen wurde gelöst, wenn Sie versuchen, diese Eigenschaft zu bekommen? – Kingpin2k

+0

Ja, das Versprechen hat sich gelöst. Wenn ich versuche, itemData so zu setzen, wie ich es gezeigt habe, kann ich diesen Wert an anderer Stelle in der js-Datei der Komponente verwenden? Ich habe vorher etwas ähnliches getan, als ich eine Komponenteneigenschaft gesetzt habe, aber ich habe das nur in der Vorlagendatei verwendet ... Kann ich das tun? Scheint es vernünftig zu versuchen, diese itemData -Eigenschaft festzulegen und diese dann in der berechneten Eigenschaft zu verwenden, um die Sortierung zu erreichen? Ich möchte dann die sortedItems in einer ForEach-Schleife an anderer Stelle im Code verwenden. – Newfoundland

Verwandte Themen