如何从模型类型中检索数据?

时间:2017-07-15 02:59:56

标签: javascript ember.js reverse-engineering

我是Ember的一个完整的菜鸟,我必须从用Ember写的外部网站检索数据。

我安装了Ember检查器插件,我看到以下内容:

enter image description here

我可以在控制台调试窗口中输入哪些javascript命令来检索列表中的数据(ID和数字)?

我不能依靠Ember检查器进行数据检索,该工具仅用于检查结构。

更新1

感谢@kumkanillam,我在这里做到了:

enter image description here

似乎我可以知道列表中某个项目的每个属性的名称和类型,但我无法获得其值。

happy数组是他的示例调用的结果:myStore.peekAll('common/following-info').toArray()

1 个答案:

答案 0 :(得分:2)

看看这个 https://guides.emberjs.com/v2.14.0/ember-inspector/container/ https://guides.emberjs.com/v2.14.0/ember-inspector/object-inspector/#toc_exposing-objects-to-the-console

它解释得非常好。

您可以通过单击检查器中的$E按钮将对象公开给控制台。这会将全局$ E变量设置为所选对象。

您还可以向控制台公开属性。将鼠标悬停在对象的属性上时,每个属性旁边都会显示一个$E按钮。单击它以将属性的值公开给控制台。

更新1

您可以在控制台中运行以下代码。

 function getApplication() {
  let namespaces = Ember.Namespace.NAMESPACES;
  let application;

  namespaces.forEach(namespace => {        
    if (namespace instanceof window.Ember.Application) {
      application = namespace;
      return false;
    }
  });
  return application;
}

你可以使用上面的函数来获取应用程序实例,从那里你可以查找访问service:store,从那里你可以使用peekAll所需的模型。为了单独查看所有必需的数据,我使用了像stringify这样的JSON方法然后解析。

我实际上使用了LinkedIn网站并使用他们的模型common/following-info进行演示。您可以选择要查看的模型,

var myApp = getApplication();
var myStore = myApp.__container__.lookup('service:store')
myStore.peekAll('common/following-info')
myStore.peekAll('common/following-info').toArray()
JSON.stringify(myStore.peekAll('common/following-info').toArray())
JSON.parse(JSON.stringify(myStore.peekAll('common/following-info').toArray()))

更新2

myStore.peekAll('common/following-info')此处返回DS.RecordArray并扩展Ember.ArrayProxy,这意味着您可以使用ArrayProxy中提供的方法。 forEach使用objectAt(index)

进行迭代或获取特定索引记录

在您的情况下,您需要知道模型的属性名称以获取特定属性的值,如

let allRecords = myStore.peekAll('common/following-info');
allRecords.forEach(function(item){
  console.log(item);
  console.log(' Using get method to value ', item.get('propName'));
});

获取特定索引值

let allRecords = myStore.peekAll('common/following-info');
let firstRecord = allRecords.objectAt(0);
console.log(' First record propName value is',firstRecord.get('propName'));

在您的情况下,您希望打印整个对象而不提供每个属性名称,然后没有内置方式,我们需要使用JSON.stringifyparse进行一些黑客攻击以获得完美对象你在找。然后你可以使用Object.values获取所有值。

let arrayOfObjectWithOnlyKeysAndValuesOfModel = JSON.parse(JSON.stringify(myStore.peekAll('common/following-info').toArray()));
arrayOfObjectWithOnlyKeysAndValuesOfModel.forEach(function(item){ 
 console.log('item',item);
 console.log(' item values alone ', Object.values(item));
});