Oracle JET Model 数据获取与使用

  Oracle JET 应用程序数据可以来自生成 JSON 数据的任何 Web 数据源,例如 REST 服务,服务器发送事件(SSE)或 WebSocket 。此外,Oracle JET 还提供了基于 Oracle REST 标准集成 Web 服务数据的特定支持。

  关于 Oracle JET Common Model 和 Collection API :

  • oj.Model:表示 REST 服务器等数据服务中的单个记录。(获取JSON数据设定单个数据模型)
  • oj.Collection:表示一组数据记录,是 oj.Model 相同类型对象的列表。(将单个数据模型收集或直接使用JSON数据模型)
  • oj.Events:提供事件处理的方法。
  • oj.KnockoutUtils:提供用于将属性 oj.Model 或 oj.Collection 对象映射到用于组件 ViewModels 的 Knockout 可观察器的方法。(将收集到的数据转化成可以在knockout使用的数据)

  oj.Model 和 oj.Collection 包括客户端 API,它提供了一种将外部数据引入 Oracle JET 应用程序的方式。

  oj.KnockoutUtils 提供了 map() 将模型对象中的属性或集合对象中的所有模型的属性映射到应用程序的视图数据模型的方法。

  案例讲解:

  一个 JSON 数据

{
  "Departments" : [ {
    "DepartmentId" : 10,
    "DepartmentName" : "Administration",
    "ManagerId" : null,
    "LocationId" : null,
    "version" : "ACED00057...contents truncated",
    "links" : {
      "self" : {
        "rel" : "self",
        "href" : "http://RESTServerIP:Port/stable/rest/Departments/10"
      },
      "canonical" : {
        "rel" : "canonical",
        "href" : "http://RESTServerIP:Port/stable/rest/Departments/10"
      },
      "Employees" : {
        "rel" : "child",
        "href" : "http://RESTServerIP:Port/stable/rest/Departments/10/Employees"
      }
    }
  }, {
    "DepartmentId" : 20,
    "DepartmentName" : "Retail Marketing",
    "ManagerId" : null,
    "LocationId" : null,
    "version" : "ACED00057...contents truncated",
    "links" : {
      "self" : {
        "rel" : "self",
        "href" : "http://RESTServerIP:Port/stable/rest/Departments/20"
      },
      "canonical" : {
        "rel" : "canonical",
        "href" : "http://RESTServerIP:Port/stable/rest/Departments/20"
      },
      "Employees" : {
        "rel" : "child",
        "href" : "http://RESTServerIP:Port/stable/rest/Departments/20/Employees"
      }
    }
  }, {
  ... contents omitted
  } ],
  "links" : {
    "self" : {
      "rel" : "self",
      "href" : "http://RESTServerIP:Port/stable/rest/Departments"
    }
  },
  "_contextInfo" : {
    "limit" : 25,
    "offset" : 0
  }
}

  要获得 DepartmentId,DepartmentName,LocationId,和ManagerId展示。

  在viewmodel中添加JS代码:

  

  1.定义单个数据模型 oj.Model.extend() 。

define([‘ojs/ojcore‘, ‘knockout‘, ‘ojs/ojmodel‘],
       function(oj, ko)
       {
           function viewModel() {
               var self = this;
               self.serviceURL = ‘http://RESTServerIP:Port/stable/rest/Departments‘;  // 一个JSON地址

       // 回调函数,用于在从数据服务返回时对JSON数据对象进行解析,形成单个数据模型。
           parseDept = function(response) {
               if (response[‘Departments‘]) {
                   var innerResponse = response[‘Departments‘][0];
                   if (innerResponse.links.Employees == undefined) {
                       var empHref = ‘‘;
                   } else {
                       empHref = innerResponse.links.Employees.href;
                   }
                   return {DepartmentId: innerResponse[‘DepartmentId‘],
                           DepartmentName: innerResponse[‘DepartmentName‘],
                           links: {Employees: {rel: ‘child‘, href: empHref}}};
               }
               return {DepartmentId: response[‘DepartmentId‘],
                       DepartmentName: response[‘DepartmentName‘],
                       LocationId:response[‘LocationId‘],
                       ManagerId:response[‘LocationId‘],
                       links: {Employees: {rel: ‘child‘, href: response[‘links‘][‘Employees‘].href}}};
           };
               var Department = oj.Model.extend({
                   urlRoot: self.serviceURL,
                   parse: parseDept,
                   idAttribute: ‘DepartmentId‘
               });

               var myDept = new Department();
           };

           return {‘deptVM‘: viewModel};
       };
}

  oj.Model.extend方法:

oj.Model.extend({
   // 可选
   // parse : 用于从数据服务中返回JSON数据对象的回调函数。
   // parseSave: 用于允许转换的用户回调函数模型返回到适用于保存调用的数据服务格式。
   // urlRoot:用于从数据服务中收集数据的URL
})

  

  2.定义上述使用的单个数据模型的集合 oj.Collection.entend() 。

  将集合限制为50个数据。

define([‘ojs/ojcore‘, ‘knockout‘, ‘ojs/ojmodel‘],
    function(oj, ko){
        function viewModel() {
            var self = this;
            self.serviceURL = ‘http://RESTServerIP:Port/stable/rest/Departments‘;
            self.Departments = ko.observableArray([]);
            self.DeptCol = ko.observable();
            self.datasource = ko.observable();

            var parseDept = function(response) {
            ... contents omitted
            };

            var Department = oj.Model.extend({
                urlRoot: self.serviceURL,
                parse: parseDept,
                idAttribute: ‘DepartmentId‘
            });

            var myDept = new Department();

            // 使用oj.Model.extend()定义的模型形成集合对象,限制50个数据
                var DeptCollection = oj.Collection.extend({
                    url: self.serviceURL + "?limit=50",
                    model: myDept
                });

                self.DeptCol(new DeptCollection());
                self.datasource(new oj.CollectionTableDataSource(self.DeptCol()));  // oj.CollectionTableDataSource 转换成需要使用的table数据类型

            }
            return {‘deptVM‘: viewModel};
        }
);

  

  3.使用oj.Collection.fetch()从服务器端获取数据(从服务器获取任务,并在完成时进一步处理)

define([‘ojs/ojcore‘, ‘knockout‘, ‘ojs/ojmodel‘],
         function(oj, ko){
            function viewModel() {
                var self = this;
                self.serviceURL = ‘http://RESTServerIP:Port/stable/rest/Departments‘;
                self.Departments = ko.observableArray([]);
                self.DeptCol = ko.observable();
                self.datasource = ko.observable();
                self.fetch = function(successCallBack) {
                    self.DeptCol().fetch({
                        success: successCallBack,
                        error: function(jqXHR, textStatus, errorThrown){
                            console.log(‘Error in fetch: ‘ + textStatus);
                        }
                    });
                }

                var parseDept = function(response) {
                   ... contents omitted
                };

                var Department = oj.Model.extend({
                    urlRoot: self.serviceURL,
                    parse: parseDept,
                    idAttribute: ‘DepartmentId‘
                });

                var myDept = new Department();

                var DeptCollection = oj.Collection.extend({
                    url: self.serviceURL + "?limit=50",
                    model: myDept
                });

                self.DeptCol(new DeptCollection());
                self.datasource(new oj.CollectionTableDataSource(self.DeptCol()));

            }
            return {‘deptVM‘: viewModel};
        }
);

  完。

  另外: 一般可以使用  var collection = new oj.Collection( null, { url: XXXXXXX }) 方法获取JSON数据

  但从 oj.Collection 获取的数据不能直接使用。需要转换才能使用。

  转换方法:

  1.使用 oj.KnockoutUtils.map()

    this.datasource = oj.KnockoutUtils.map(collection);

  2.    this.datasource = collection.map( function( model ) {

       return model.attributes;

    } );

  3. 使用特别的API,如 oj.CollectionDataGridDataSource

  

时间: 2024-10-13 09:02:27

Oracle JET Model 数据获取与使用的相关文章

Oracle JET简单入门(一)Oracle JET介绍

Oracle JET (Oracle Javascript Extension Toolkit)是一款 Oracle 的 JavaScript 拓展工具包.简单来说 Oracle JET 是一个一堆好用的前端工具结合体. Oracle JET 文档链接  http://docs.oracle.com/middleware/jet310/jet/developer/toc.htm Oracle JET支持 Model-View-ViewModel(MVVM)架构设计模式. 在 MVVM 中,Mod

Oracle JET mobile cordove navigator.app对象

在使用 Oracle JET 开发 webapp 时,会使用到 ojrouter ,ojrouter 默认含有历史记录推送功能.在调试 Android 时会发现返回键总是返回到上一次浏览记录(App 中的记录),这在 Android 端使用时是不合理的. 解决方法: 1.在创建 router 时取消默认的历史记录推送功能.文档里没有写明如何取消,该方法有待补充. 2.在使用 router 时调用 go 方法,调用此方法时可以添加参数 go('stateId', {historyUpdate: s

Oracle JET 起步

初识JET,相见恨晚 Oracle JET介绍 Oracle JET是一个用于经验丰富的JavaScript开发人员构建基于客户端的基于JavaScript的应用程序的工具包.它是代码重,最绝对不是为JavaScript初学者. Oracle说:"在使用Oracle JET成功开发应用程序之前,您应该熟悉JET框架使用的第三方库和技术.该列表包含: JQuery JQuery UI Knockout JavaScript CSS HTML5 SASS Apache Cordova (if you

Oracle JET(三)Oracle JET 响应布局

Oracle JET 提供了一系列的 CSS 样式以直接使用. Oracle JET CSS样式链接:http://docs.oracle.com/middleware/jet310/jet/reference-css/index.html 进入主题,在Oracle JET 的样式中提供了响应式布局. 一.Oracle JET Flex布局 要创建Flex布局,首先将 oj-flex 添加到容器中,然后将 oj-flex-item 添加到每个自容器. 例1: <div id="contai

Oracle JET 单页面应用程序Router 使用(上)

单页面应用程序:使用一个进加载一次的网页,如果页面由于用户的交互而改变,则仅绘制更改的页面部分. 要创建单页面应用程序需要使用 oj.Router 的虚拟导航来支持,ojModule 用来响应页面的重新绘制. ojModule 仅用于分离的 view 和 viewMode ,使之与页面通过 Knockout绑定.另外,ojModule 可选,当不使用分离视图与模型时,可直接在元素上响应变化. 1.简单模型: 当选择 Chapter1 或其他时,将显示新内容,并且URL更改以反映用户在页面上当前的

Oracle JET 使用RequireJS第三方工具或库引入

在 Oracle JET 应用程序中使用 RequireJS 添加第三方工具或库. 步骤: 1.如果使用工具框架脚手架,需要一下操作. a.使用 npm 安装你需要的库. npm install my-library --save b.在 script/grunt/config 目录中,在 oraclejet-build.js 中找到 copyCustomLibsToStaging 更新代码. 把注释去掉.并更改: copyCustomLibsToStaging: { fileList: [ {

通过案例学调优之--Oracle Time Model(时间模型)

通过案例学调优之--Oracle Time Model(时间模型) 数据库时间  优化不仅仅是缩短等待时间.优化旨在缩短最终用户响应时间和(或)尽可能减少每个请求占用的平均资源.有时这些目标可同时实现,而有时则需要进行折衷(如在并行查询时).通常可以认为,优化就是避免以浪费的方式占用或保留资源. 对数据库发出的任何请求都由两个不同的段组成:等待时间(数据库等待时间)和服务时间(数据库 CPU 时间).等待时间是各种数据库实例资源的所有等待时间的总和.CPU 时间是实际处理请求时消耗的时间的总和.

Oracle的model语句入门-转

Model语句是Oracle 10g的新功能之一. 本文通过一些简单的例子帮助理解Model语句的用法,复杂使用场景请参考其他文章. 环境:当然需要Oracle 10g以上,本人是在11g上测试的. 1. 什么是model语句 model语句是Oracle10g的新功能,可以在select语句里面像其他编程语言操作数组一样,对SQL的结果集进行处理.执行顺序是位于Having之后. select的解析执行顺序 1. from语句 2. where语句 (结合条件) 3. start with语句

Oracle EBS Model Function Technical

?.Oracle EBS(ERP)Oracle 是公司名字,这个我估计大家都知道.EBS是E-Business Suite的缩写,简单的说,就是Oracle做的一个企业级的信息化软件或者系统,里面包含了财务,人力,分销,资产等很多企业用的到的模块.现在主流的就是SAP和Oracle EBS.在EBS 顾问这个行业,粗略的有以下分工.?.Oracle EBS Function Consultant 功能顾问功能顾问呢,就是业务顾问,可以理解为普通软件行业的产品经理,主要是熟悉业务的同时也熟悉系统相