سؤال

لدي في تطبيقي حالات تجلب موارد مختلفة من الخادم باستخدام resolve بند.

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

كيف يمكنني الوصول إلى هذه الموارد من وحدة التحكم العالمية؟حتى لو كان كائن الحالة في متناول يدي، لم أتمكن من معرفة كيفية استخراج الخصائص التي تم حلها.

يحرر:أنا استخدم ui-router حزمة للتوجيه.

هل كانت مفيدة؟

المحلول 2

تتمثل الفكرة في إضافة مفتاح حل يعتمد على البيانات المطلوبة (انظر breadcrumb في الكود أدناه).عندما يتم استدعاء وظيفة هذا المفتاح، يمكننا التأكد من أن بياناتنا item جاهز للاستخدام.ثم نضعها على الدولة (data ملكية).

.state('some.item.detail.state', {
  url: '/:itemId',
  resolve: {
    item: function($stateParams, MyServerResource) { 
            return MyServerResource.get({itemId: $stateParams.itemId}).$promise;
          },
    breadcrumb: function(item) {
                  this.data = item;
                }
  },
  templateUrl: 'myTemplate.html'
}

لاستهلاك البيانات في وحدة التحكم العالمية، نقوم بفحص بسيط $state.current.data.

نصائح أخرى

كما أفهمها، لديك شيء مثل هذا:

  .when('/', {
    controller: 'HomeCtrl',
    templateUrl: 'home.html',
    resolve: {data: someDataFetcher}
  })

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

function HomeCtrl (data, myDataService) {
  myDataService.data = data;
}

function GlobalCtrl (myDataService) {
  myDataService.data // => The data
}

تحتوي الخدمة على مثيل واحد فقط، لذلك من السهل استخدامها لمشاركة الحالة والموارد عبر وحدات التحكم.

أتمنى أن يساعدك هذا.

تحديث:

إنشاء إغلاق الحل:

var myResolveClosure = function (resolver) {
    // Return a wrapper around the resolver
    return function (globalController, $q) { 
      var deferred = $q.defer();
      resolver($q).then(function (data) {
        globalController.addData(data);
        deferred.resolve(data);
      }).catch(function () {
        deferred.reject();
      });
      return deferred.promise;
    }
}

  .when('/', {
    controller: 'HomeCtrl',
    templateUrl: 'home.html',
    resolve: {
     data: myResolveClosure(function ($q) {
       var deferred = $q.defer();
       // do something and resolve with the data
       return deferred.promise;
     })
    }
  })

لذلك تقوم أساسًا بتمرير برنامج الحل المحدد الذي تحتاجه لجلب تلك البيانات.سيقوم "myResolveClosure" بتغليف دالة حول المحلل، ويمرر $q إلى المحلل المحدد للقيام ببعض الجلب.بعد ذلك، سيأخذ البيانات التي تم حلها من محلل معين ويمررها إلى وحدة التحكم العامة، ثم يحل نفسه بنفسه حتى تحصل أي وحدة تحكم تحددها أيضًا على البيانات.

آمل أن يكون هذا منطقيا :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top