एम्बर डेटा: एम्बर ऑब्जेक्ट्स में AJAX कॉल कैसे करें (कोई विधि 'ढूंढें' नहीं है)

मैं एम्बर डेटा (1.0.0 बीटा 4) पर अपने एपीएक्स को एजेक्स कॉल करने की कोशिश कर रहा हूं, लेकिन मुझे नहीं पता कि राउटर के बाहर मॉडल का उपयोग कैसे किया जाए। दस्तावेज केवल ऐसे उदाहरण प्रदान करता है:

App.PostRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('post', params.post_id);
  }
});

मेरा कोड:

var AuthManager = Ember.Object.extend({

  authenticate: function(accessToken, userId) {

    var user = this.store.find('user', userId);
    /* ... */

  },
  /* ... */

});

अब मुझे कोई विधि नहीं है 'ढूंढें' :

Uncaught TypeError: Object function() {
    if (!wasApplied) {
      Class.proto();//prepare prototype...
    }
    o_defineProperty(this, GUID_KEY, undefinedDescriptor);
    o_defineProperty(this, '_super', undefinedDescriptor);
    var m = meta(this), proto = m.proto;
    m.proto = this;
    if (initMixins) {
     //capture locally so we can clear the closed over variable
      var mixins = initMixins;
      initMixins = null;
      this.reopen.apply(this, mixins);
    }
    if (initProperties) {
     //capture locally so we can clear the closed over variable
      var props = initProperties;
      initProperties = null;

      var concatenatedProperties = this.concatenatedProperties;

      for (var i = 0, l = props.length; i < l; i++) {
        var properties = props[i];

        Ember.assert("Ember.Object.create no longer supports mixing in other definitions, use createWithMixins instead.", !(properties instanceof Ember.Mixin));

        if (typeof properties !== 'object' && properties !== undefined) {
          throw new Ember.Error("Ember.Object.create only accepts objects.");
        }

        if (!properties) { continue; }

        var keyNames = Ember.keys(properties);

        for (var j = 0, ll = keyNames.length; j < ll; j++) {
          var keyName = keyNames[j];
          if (!properties.hasOwnProperty(keyName)) { continue; }

          var value = properties[keyName],
              IS_BINDING = Ember.IS_BINDING;

          if (IS_BINDING.test(keyName)) {
            var bindings = m.bindings;
            if (!bindings) {
              bindings = m.bindings = {};
            } else if (!m.hasOwnProperty('bindings')) {
              bindings = m.bindings = o_create(m.bindings);
            }
            bindings[keyName] = value;
          }

          var desc = m.descs[keyName];

          Ember.assert("Ember.Object.create no longer supports defining computed properties.", !(value instanceof Ember.ComputedProperty));
          Ember.assert("Ember.Object.create no longer supports defining methods that call _super.", !(typeof value === 'function' && value.toString().indexOf('._super') !== -1));
          Ember.assert("`actions` must be provided at extend time, not at create time, when Ember.ActionHandler is used (i.e. views, controllers & routes).", !((keyName === 'actions') && Ember.ActionHandler.detect(this)));

          if (concatenatedProperties && indexOf(concatenatedProperties, keyName) >= 0) {
            var baseValue = this[keyName];

            if (baseValue) {
              if ('function' === typeof baseValue.concat) {
                value = baseValue.concat(value);
              } else {
                value = Ember.makeArray(baseValue).concat(value);
              }
            } else {
              value = Ember.makeArray(value);
            }
          }

          if (desc) {
            desc.set(this, keyName, value);
          } else {
            if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) {
              this.setUnknownProperty(keyName, value);
            } else if (MANDATORY_SETTER) {
              Ember.defineProperty(this, keyName, null, value);//setup mandatory setter
            } else {
              this[keyName] = value;
            }
          }
        }
      }
    }
    finishPartial(this, m);
    this.init.apply(this, arguments);
    m.proto = proto;
    finishChains(this);
    sendEvent(this, "init");
  } has no method 'find' 

In Ember Data < 0.14 methods like App.User.find(id) were present but it's deprecated

0

1 उत्तर

आप AuthManager में किसी स्टोर को इंजेक्ट करने के लिए निर्भरता इंजेक्शन का उपयोग कर सकते हैं:

Ember.Application.initializer({
  name: "inject store in auth manager",
  initialize: function(container, application) {
     //register the AuthManager in the container
      container.register('authManager:main', App.AuthManager);
     //inject the store in the AuthManager
      container.injection('authManager', 'store', 'store:main');
     //inject the AuthManager in the route 
      container.injection('route', 'authManager', 'authManager:main');
     //inject in the controller
     //container.injection('controller', 'authManager', 'authManager:main');
  }
});

और मार्ग में आप करने में सक्षम होंगे:

App.IndexRoute = Ember.Route.extend({
  model: function() {
      this.authManager.authenticate('token', 'userId');
      return [];
  }
});

See this in action http://jsfiddle.net/marciojunior/3dYnG/

0
जोड़ा
बस मेरी समझ के लिए: मुझे मार्ग को इंजेक्ट क्यों करना है? क्योंकि प्रमाणीकरण विधि केवल मेरे फॉर्म में मेरी लॉगिन विधि के बाद ही होती है, न कि मार्ग init पर।
जोड़ा लेखक Slevin, स्रोत
ठीक है, लेकिन समस्या यह है कि this.authManager.authenticate ('टोकन', 'userId'); मार्ग लोड होने पर प्रमाणीकृत विधि को सक्रिय करता है। लेकिन जब लॉगिन-फॉर्म जमा किया गया था तो इसे पहले निकाल दिया जाना चाहिए
जोड़ा लेखक Slevin, स्रोत
मेरा कोड है: jsfiddle.net/3dYnG/2 मुझे आशा है कि यह मेरी समस्या को बेहतर ढंग से दिखाता है :)
जोड़ा लेखक Slevin, स्रोत
वाह! आप सर्वश्रेष्ठ हैं! आपको बहुत - बहुत धन्यवाद! :)
जोड़ा लेखक Slevin, स्रोत
आपका स्वागत है! मार्ग पहले से ही एम्बर द्वारा इंजेक्शन दिया गया है, मैं बस रास्ते में authManager संपत्ति इंजेक्ट करता हूं, आप बेवकूफ में देखते हैं
जोड़ा लेखक Marcio Junior, स्रोत
मैंने आपकी पहेली को अपडेट किया है, कृपया एक नज़र डालें jsfiddle.net/marciojunior/3zGsC । मैंने सभी नियंत्रकों में authManager इंजेक्शन दिया, ताकि आप लॉगिन नियंत्रक के loginUser कार्रवाई में उपयोग कर सकें।
जोड़ा लेखक Marcio Junior, स्रोत
आपका स्वागत है! :)
जोड़ा लेखक Marcio Junior, स्रोत