Ember Data: 如何在 Ember-Objects 中进行 AJAX 调用(没有方法 'find' )



我正试图通过Ember Data(1.0.0 Beta 4)对我的API进行AJAX调用,但我不知道如何访问路由器外部的模型。文档仅提供以下示例:

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);
    /* ... */
  },
  /* ... */
});

现在我得到has no method 'find':

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' 

在Ember数据<有0.14种方法,如App.User.find(id),但不推荐使用

您可以使用依赖项注入在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 [];
  }
});

请参阅实际操作http://jsfiddle.net/marciojunior/3dYnG/

最新更新