2

Discussion.emberjs.com からの相互投稿

モデルを保存しようとしていますが、保存が成功すると、初期モデルに関連するいくつかの追加モデルが保存されます。これらは標準入力フィールドにあり、ED にバインドする方法がわからない/わからないため、標準の jQuery セレクターを使用して入力を見つけ、モデルを保存しています。すべてのモデルは適切に保存されていますが、エラーのためEmber.RSVP.allREJECTコールバックが実行されていArray Methods must be provided an Arrayます。配列をどこに提供する必要があるのか​​ 正確にはわかりません...

途中でさまざまな要素を調べましたがvar promises、期待どおりの約束の配列です。私が考えることができる唯一のことはresults、解決コールバックに渡される値が配列であるはずですか? Ember.A()その場合、単に渡すか、または渡す以外に配列にする方法がわかりません[]

これが私のコントローラーの関連コードです。

submit: function () {
    var self = this;
    var division = this.get('model');
    var isNew = division.get('isNew');

    if(isNew) {
        division.setProperties({
            vendor: self.get('parentVendor'),
            vendorCategory: self.get('selectedCategory'),
            isActive: true,
            createdBy: 1,
            createdDate: moment().format()
        });
    } else {
        division.setProperties({
            vendorCategory: self.get('selectedCategory'),
            modifiedBy: 1,
            modifiedDate: moment().format()
        });
    }

    division.validate().then(function () {
        if (division.get('isValid')) {
            division.save().then(function(result) {

                /*
                    this bit of hackishness loops through each of the attribute input fields, creates a new DS.model for that attribute, 
                    saves the model, then returns the resulting promise to the promises array so they can be processed by RSVP.all to 
                    ensure that all the attributes save properly.
                 */

                // map the promises array
                var promises = $('input.attribute').map(function () {
                    var elem = $(this)[0];
                    var vendorTypeAttrId = $(elem).attr('data-attribute-id'),
                        attrValue = $(elem).val();

                    // create the model
                    var model = self.store.createRecord('vendor-division-attribute', {
                        division: result,
                        vendorTypeAttribute: self.get('categoryAttributes').findBy('id', vendorTypeAttrId),
                        value: attrValue,
                        createdBy: 1,
                        createdDate: moment().format()
                    });

                    // return the save promise
                    var p = model.save();
                    return p;
                });

                // Make sure all promises are resolved before continuing
                Ember.RSVP.all(promises).then(function (results) {
                    // it worked! keep calm and move along
                    self.send('closeModal');
                    var msg = isNew ? division.get('name') + ' Created!' : 'Changes saved!';
                    Bootstrap.NM.push(msg, 'success');
                }).catch(function(reason) {
                    // something went wrong - display the error
                    if (typeof reason.error !== 'undefined') {
                        // DSP error
                        if (Ember.keys(reason.error).length > 0) {
                            error = reason.error[0].message;
                        } else {
                            error = 'An error occured while saving your changes';
                        }
                    } else if (typeof reason.message !== 'undefined') {
                        error = reason.message;
                    } else {
                        error = reason;
                    }
                    console.log(error);
                    Bootstrap.NM.push('Error saving Vendor Division: ' + error, 'danger');
                });

            }, function(reason) {
                var error;
                if (typeof reason.error !== 'undefined') {
                    // DSP error
                    if (Ember.keys(reason.error).length > 0) {
                        error = reason.error[0].message;
                    } else {
                        error = 'An error occured while saving your changes';
                    }
                } else if (typeof reason.message !== 'undefined') {
                    error = reason.message;
                } else {
                    error = reason;
                }
                console.log(error);
                Bootstrap.NM.push('Error saving Vendor Division: ' + error, 'danger');
            });
        }
    });
}
4

1 に答える 1