Ember.js: لا يؤدي تعيين خاصية تحكم في "setupController" إلى تحديث معلمة الاستعلام

تم إنشاؤها على ٢١ أغسطس ٢٠١٤  ·  29تعليقات  ·  مصدر: emberjs/ember.js

إذا كان لديك وحدة تحكم محددة على أنها

App.IndexController = Ember.Controller.extend({
  queryParams: ['foo'],
  foo: ''
});

وفي وحدة تحكم إعداد المسارات ، تقوم بعمل شيء مثل ...

setupController: function(controller, model){
  controller.set('model', model);
  controller.set('foo', 'bar'); // <-- setting this should update the query param
}

لم يتم تعيين معلمة الاستعلام في عنوان URL.

يمكنك رؤية سلة العمل هنا: http://emberjs.jsbin.com/dekuj/1/edit

Bug Inactive Query Params

التعليق الأكثر فائدة

أنا أيضًا أرى هذه المشكلة على Ember 2.11 ، محاولة مسح معلمة الاستعلام في وحدة التحكم ليس لها أي تأثير ، فإن حل

ال 29 كومينتر

تم إصلاحه Ember.run.later (للتأكد من أن الأشياء قد تحققت بالكامل أولاً): http://emberjs.jsbin.com/kowoqo/1/edit

machty - ما هو السلوك المتوقع هنا؟

اعتقدت أن لدينا اختبارات صريحة لهذا ... التحقق.

أعتقد أن هذا خطأ ... لدينا اختبارات لهذا ولكن فقط في سياق transitionTo وليس التمهيد الأولي للتطبيق.

العمل: http://jsbin.com/mejeto/1#/about

لقد أضفت اختبارًا فاشلاً لهذا الخطأ https://github.com/emberjs/ember.js/pull/5473
سأحاول أن يأخذ طعنة في إصلاح هذا

أعتقد أنني عثرت على مشكلة ذات صلة ، لذلك لست متأكدًا مما إذا كانت بحاجة إلى تذكرة منفصلة هنا في GitHub.

export default Ember.Controller.extend({
    queryParams: ['modal'],
    modal: null,
    handleModal: function () {
        this.send('openModal', this.get('modal'));
    }.observes('modal')
});
export default Ember.Route.extend({
    actions: {
        openModal: function (name) {
            return this.render(name, {
                into: 'application',
                outlet: 'modal'
            });
        }
    }
});

يعمل هذا في جميع الحالات إلى جانب التمهيد عندما يرمي Error while processing route: index Nothing handled the action 'openModal'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.

يمكن إصلاحه باستخدام Ember.run.next

handleModal: function () {
    Ember.run.next(this, function () {
        this.send('openModal', this.get('modal'));
    });
}.observes('modal')

على الرغم من أنه يبدو خطأ.

JSBins:
بدون Ember.run.next يلقي خطأ
مع Ember.run.next يطبع "redered" في وحدة التحكم

@ Igor10k أواجه نفس المشكلة بالضبط ،

يمكن لأي شخص أن يؤكد أن هذه لا تزال مشكلة في 1.8؟

wagenet نعم ، لا تزال هذه مشكلة في 1.8:
http://emberjs.jsbin.com/lezuhu/1/edit؟html ، js، output

والكناري:
http://emberjs.jsbin.com/doyohe/1/edit؟html ، js، output

@ ماشتي - خواطر؟

أعتقد أن هذا أيضًا خطأ بالنسبة لي أيضًا باستخدام 1.8.1. ما أريد القيام به هو استدعاء طريقة خاصة على وحدة التحكم الخاصة بي في كل مرة يتغير فيها استعلام محدد. لدي جهاز توجيه يبدو شيئًا كهذا.
اي نصيحه؟

// ...snip...

// for pagination
queryParams: {
  offset: {
    refreshModel: true
  }
},

model: function(params) {
  // returns model
},

setupController: function(controller, model) {
  this._super(controller, model);
  controller.set('model', model);

  // Fetch results is a method that does a bunch work
  // sets up some filters, generates a promise, resolves that promise
  // and then sets some array data on the controller once promise resolves.
  // offset is a pagination feature which determines which specific results
  // are fetched. I would like to be able to call fetchResults everytime the
  // offset queryParam is changed. 
  Ember.run.later(function() {
    controller.sendAction('fetchResults');
  })
}

// ...snip...

machty - أفكار حول من أين تبدأ الحفر في هذا؟

انا لدى نفس المشكله. this.set () في وحدة التحكم لن تقوم بتحديث معلمة الاستعلام في عنوان URL

App.SearchController = Ember.Controller.extend ({
queryParams: ['المجال'] ،
المجال: فارغ ،

domainField: Ember.computed.oneWay ("المجال") ،
أجراءات: {
searchSubmit: الوظيفة () {
this.set ('domain'، this.get ('domainField')) ؛ // يقوم هذا بتعيين معلمة "المجال" ولكنه لا يعدل عنوان URL. لذلك لا يتم استدعاء النموذج الموجود في App.SearchRoute كما هو متوقع
}
} ،
}) ؛

App.SearchRoute = Ember.Route.extend ({
queryParams: {
نطاق: {
RefreshModel: true // الاشتراك في الانتقال الكامل
} ،

} ،
model: function (params) {
var domain = params.queryParams.domain ؛

  return $.getJSON('/search?domain=usv.com&name=').then(function(resp){
  console.log(resp);
  return resp.data;
});

} ،
أجراءات: {
تحديث: وظيفة () {
Ember.Logger.log ("يتم تحديث المسار الآن ...") ؛
this.refresh () ؛
}
} ،
}) ؛

هل يمكنك من فضلك تقديم عمل في هذه الأثناء؟

للتوضيح: this.set () في الكود الخاص بي ستجري التغيير على كائن Class ، لكنها لا تغير عنوان URL على الإطلاق

هذا قديم ، لكن يبدو أنه لا يزال يمثل مشكلة؟ لا يمكنني معرفة الظروف ، ولكن بشكل دوري عندما أحاول تعيين معلمة استعلام من وحدة التحكم ، فإنها لا تنتشر إلى عنوان URL. يمكنني التحقق من قيمة الخاصية على وحدة التحكم وتعيينها بشكل صحيح ، لكن عنوان URL لم يتغير. حاولت استخدام Ember.run.next دون جدوى. ويل!

تعاني من هذه المشكلة أيضًا

rwjblue : هل هناك أي تحديث على هذا؟

أي تحديث؟ هنا حتى عند تغيير القيمة من وحدة التحكم ، يتم تحديث عنوان url لبضع مللي ثانية ويعود إلى القيمة القديمة ، حتى لو كانت وحدة التحكم تحتوي على القيمة الجديدة في المتغير

إليك الحل:

في وحدة التحكم ، أضف مراقبًا يقوم بتغيير معلمة الاستعلام في حلقة التشغيل التالية بعد تعيينها. في هذا المثال ، أردت إزالة معلمة الاستعلام token من عنوان URL وهذا الأسلوب يعمل بشكل جيد.

import Ember from 'ember';

export default Ember.Controller.extend({
  queryParams: ['token'],

  token: null,

  unsetToken: Ember.observer('token', function() {
    if (this.get('token')) {
      Ember.run.next(this, function() {
        this.set('token', null);
      });
    }
  }),
});

واجهت هذا اليوم ، عندما حاولت تعيين معلمة استعلام من setupController عند التمهيد. يبدو run.next كحل بديل ، لكنني أعتقد أن الحل المناسب هو أن يكون لديك مساران ، وفي التمهيد الأول ، سينتقل المسار إلى المسار الثاني مع قيمة معلمة الاستعلام.

إمبر 2.8

وضع علامة على المشكلة بأنها غير نشطة وفقًا لسياسة الفرز الخاصة بنا.

أنا أيضًا أرى هذه المشكلة على Ember 2.11 ، محاولة مسح معلمة الاستعلام في وحدة التحكم ليس لها أي تأثير ، فإن حل

تحرير: تجاهل كل موسيقى الجاز هذه. هناك بعض المعلومات السيئة / الخاطئة هنا ، وقد وجهنيlocks نحو حل أفضل بكثير - باستخدام معلمة استعلام بدلاً من مقطع ديناميكي - في السطر مباشرةً أدناه. إنه يربط معلمة الاستعلام بخاصية عادية بخاصية محسوبة في الظل تقوم بتعقيم وتعيين get (تضمنت محاولاتي السابقة ربط معلمة الاستعلام بخاصية محسوبة تم تعقيمها وتعيينها على set ) . آسف على الضوضاء!


الحل الأفضل ...

// app/router.js
Router.map(function() {
  this.route('shop');
});

// app/routes/shop.js
export default Ember.Route.extend({
  queryParams: {
    _selectedItemIndex: {
      replace: true
    }
  }
});

// app/controllers/shop.js
import computed from 'ember-macro-helpers/computed';

export default Ember.Controller.extend({
  cart: Ember.service.inject(),

  queryParams: {
    _selectedItemIndex: 'i'
  },

  _selectedItemIndex: 0,

  selectedItemIndex: computed('_selectedItemIndex', {
    get(index) {
      const itemsLength = this.get('cart.items.length');

      if (isNaN(index) || index < 0 || index >= itemsLength) {
        index = 0;
      }

      return this.set('_selectedItemIndex', index);
    },

    set(index) {
      return this.set('_selectedItemIndex', index);
    }
  })
});


المشكلة الأصلية والحل ...

لقد فقدت الجزء الأفضل من الأمس بسبب هذه المشكلة التي لا تزال قائمة في الإصدار 2.14-beta. حالة الاستخدام الخاصة بي هي تعقيم معامل الاستعلام لاستخدامه كفهرس في Ember.Array. إذا كان التنسيق غير صحيح (مثل NaN أو سلسلة) و / أو خارج الحدود ، فيجب أن يستخدم فهرسًا افتراضيًا ، ويحدّث عنوان URL ليعكس التعديل (بحيث يتم تشغيل الأحداث استجابةً للنقرات المستقبلية بشكل مناسب - يمكنني شرح ذلك بشكل أكبر لـ تساعد في إثبات أن هذه ليست مجرد قضية تجميلية).

لا يمكنني تعيين الخاصية من setupController() لأنه لا يقوم بتحديث عنوان URL (كما هو موضح في هذه المشكلة). لا يمكنني تعيينه في العلامة التالية باستخدام Ember.run لأن ذلك سيصبح ساري المفعول بعد فوات الأوان (أي أنه قد تم بالفعل استخدام فهرس غير صالح للوصول إلى المصفوفة). لا يمكنني تعيينه مرة واحدة ثم تعيينه مرة أخرى في العلامة التالية لتحديث عنوان URL لأنه لا يوجد تغيير في الخاصية (أو على الأقل هذا ما أظن أنه سبب عدم نجاحه).

لا يمكنني استخدام خاصية محسوبة مع أداة ضبط التعقيم في وحدة التحكم لأنه لا يمكنك ربط معلمة استعلام بخاصية محسوبة. لا يمكنني استخدام مراقب في خاصية عادية لأنه لا يمكنك تعيين الخاصية التي تراقبها. لا يمكنني استخدام مراقب مع Ember.run بسبب المشكلة الموضحة أعلاه.

لا يمكنني الاتصال بـ this.transitionTo({ queryParams: .. }) من setupController() أو الخطاف beforeModel() أو controller.transitionToRoute({ queryParams: .. }) من setupController() بسبب # 14606 والمشكلات ذات الصلة. لا يمكنني تعيين refreshModel إلى true لمعامل الاستعلام نظرًا لحدوث أشياء أخرى في الخطاف model() والذي يجب عدم تكراره إذا تغيرت معلمة طلب البحث هذه.

من الواضح أن هناك علاقة بين الألم هنا. تتحد هذه المشكلة ، المشكلة رقم 14606 ، والقيود المفروضة على عدم القدرة على ربط معلمة استعلام بخاصية محسوبة لإنشاء فخ صغير أنيق ومحبط.

إليك الحل البديل الخاص بي: لقد قمت بإنشاء مسار "تحديد" متداخل يأخذ ببساطة معلمة الاستعلام (أو - كما في الكود أدناه - مقطع ديناميكي) ، ويعقمه ، ويضبط الخاصية على وحدة التحكم الرئيسية الخاصة به. إذا كان الفهرس المطهر خارج الحدود ، فإنه ينتقل إلى مسار الفهرس المتداخل ، والذي بدوره ينتقل مرة أخرى إلى مسار التحديد المتداخل باستخدام الفهرس الافتراضي. لا تحتوي المسارات المتداخلة على قوالب أو وحدات تحكم ولا يحتوي المسار الرئيسي على منفذ ؛ كانت موجودة فقط لمعالجة مشكلة التوجيه هذه.

// app/router.js
Router.map(function() {
  this.route('shop', function() {
    this.route('index', { path: '/' });
    this.route('select', { path: '/:index' });
  });
});

// app/routes/shop.js
export default Ember.Route.extend({
  setupController(controller, model) {
    this._super(...arguments);

    // some logic to set up the cart service
  },

  model() {
    // fetch products to shop
  }
});

// app/controllers/shop.js
export default Ember.Controller.extend({
  cart: Ember.service.inject(),

  selectedItemIndex: 0,

  actions: {
    selectItem(index) {
      return this.replaceRoute('shop.select', index);
    }
  }
});

// app/routes/shop/index.js
export default Ember.Route.extend({
  beforeModel() {
    return this.replaceWith('shop.select', 0);
  }
});

// app/routes/shop/select.js
export default Ember.Route.extend({
  setupController(_, { index }) {
    this._super(...arguments);

    const
      parentController = this.controllerFor('shop'),
      itemsLength = parentController.get('cart.items.length');

    index = parseInt(index, 10);
    if (Number.isNaN(index) || index < 0 || index >= itemsLength) {
      return this.replaceWith('shop.index');
    }

    parentController.set('selectedItemIndex', index);
  },

  model: _ => _
});

mwpastore شكرا

locks إذا كنت تريد ، يرجى إعادة فتح مشكلة التوثيق لتدوين ذلك على setupController (انظر الملاحظات في القوائم المنسدلة من خلال

mwpastore يبدو أنه يمكننا المتابعة مع https://discuss.emberjs.com/ مع الحل الخاص بك

انتظر حتى يتم إغلاق هذه المشكلة بحل بديل للتغلب على الخطأ الذي يبلغ عنه ، وهذا الحل يتضمن تعيين خاصية في أداة جمع محسوبة؟

أشعر بالفضول إذا كان هناك تحديث بشأن هذا.

أنا أستخدم Ember.run.next داخل Route setupController

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات