当前位置: 首页 > 软件库 > 程序开发 > >

ember-custom-actions

Custom API actions for Ember applications
授权协议 MIT License
开发语言 JavaScript
所属分类 程序开发
软件类型 开源软件
地区 不详
投 递 者 马晓博
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Ember Custom Actions Logo

Ember Custom Actions is a package for defining custom API actions, dedicated for Ember 2.16 (and higher) applications.

Getting started

Demo

Before you will start with documentation check our demo app: Ember-Custom-Actions Website

Installation

ember install ember-custom-actions

Documentation

Model actions

To define custom action like: posts/1/publish you can usemodelAction(path, options) method with arguments:

  • path - url of the action scoped to our api (in our case it's publish)
  • options - optional parameter which will overwrite the configuration options
import Model from 'ember-data/model';
import { modelAction } from 'ember-custom-actions';

export default Model.extend({
  publish: modelAction('publish', { pushToStore: false }),
});

Usage

let user = this.get('currentUser');
let postToPublish = this.get('store').findRecord('post', 1);
let payload = { publisher: user };

postToPublish.publish(payload, /*{ custom options }*/).then((status) => {
  alert(`Post has been: ${status}`)
}).catch((error) => {
  console.log('Here are your serialized model errors', error.serializedErrors);
});

Resource actions

To a define custom action like: posts/favorites you can useresourceAction(actionId/path, options) method with arguments:

  • path - url of the action scoped to our api (in our case it's favorites)
  • options - optional parameter which will overwrite the configuration options
import Model from 'ember-data/model';
import { resourceAction } from 'ember-custom-actions';

export default Model.extend({
  favorites: resourceAction('favorites', { method: 'GET' }),
});

Usage

let user = this.get('currentUser');
let emptyPost = this.get('store').createRecord('post');
let payload = { user };

emptyPost.favorites(payload, /*{ custom options }*/).then((favoritesPosts) => {
  console.log(favoritesPosts);
}).finally(()=>{
  emptyPost.deleteRecord();
});

Custom actions

To define customAction and customize it by using ember-data flow, adapters and serializer you can use customAction(actionId, options) method with arguments:

  • actionId - id of the action which can be handled later on in adpaters and serializers
  • options - optional parameter which will overwrite the configuration options

If you want to customize your request in your adapter please, implement our adapter mixin:

import JSONAPIAdapter from 'ember-data/adapters/json-api';
import { AdapterMixin } from 'ember-custom-actions';

export default JSONAPIAdapter.extend(AdapterMixin);

Now you can customize following methods in the adpater:

urlForCustomAction

You can define your custom path for every customAction by adding a conditional:

export default JSONAPIAdapter.extend(AdapterMixin, {
  urlForCustomAction(modelName, id, snapshot, actionId, queryParams) {
    if (actionId === 'myPublishAction') {
      return 'https://my-custom-api.com/publish'
    }

    return this._super(...arguments);
  }
});

If you would like to build custom modelAction you can do it by:

import { AdapterMixin } from 'ember-custom-actions';

export default JSONAPIAdapter.extend(AdapterMixin, {
  urlForCustomAction(modelName, id, snapshot, actionId, queryParams) {
    if (requestType === 'myPublishAction') {
      return `${this._buildURL(modelName, id)}/publish`;
    }

    return this._super(...arguments);
  }
});

methodForCustomAction

You can define your custom method for every customAction by adding a conditional:

import { AdapterMixin } from 'ember-custom-actions';

export default JSONAPIAdapter.extend(AdapterMixin, {
  methodForCustomAction(params) {
    if (params.actionId === 'myPublishAction') {
      return 'PUT';
    }

    return this._super(...arguments);
  }
});

headersForCustomAction

You can define your custom headers for every customAction by adding a conditional:

import { AdapterMixin } from 'ember-custom-actions';

export default JSONAPIAdapter.extend(AdapterMixin, {
  headersForCustomAction(params) {
    if (params.actionId === 'myPublishAction') {
      return {
        'Authorization-For-Custom-Action': 'mySuperToken123'
      };
    }

    return this._super(...arguments);
  }
});

dataForCustomAction

You can define your custom data for every customAction by adding a conditional:

import { AdapterMixin } from 'ember-custom-actions';

export default JSONAPIAdapter.extend(AdapterMixin, {
  dataForCustomAction(params) {
    if (params.actionId === 'myPublishAction') {
      return {
        myParam: 'send it to the server'
      };
    }

    return this._super(...arguments);
  }
});

params contains following data: data, actionId, modelId, model

Configuration

You can define your custom options in your config/environment.js file

module.exports = function(environment) {
  var ENV = {
    'emberCustomActions': {
      method: 'POST',
      data: {},
      headers: {},
      queryParams: {},
      ajaxOptions: {},
      adapterOptions: {},
      pushToStore: false,
      responseType: null,
      normalizeOperation: ''
    },
  };

  return ENV;
}

method

Default method of the request (GET, PUT, POST, DELETE, etc..)

headers

An object {} of custom headers. Eg:

{
  'my-custom-auth': 'mySuperToken123'
}

ajaxOptions

Your own ajax options.** USE ONLY IF YOU KNOW WHAT YOU ARE DOING! **Those properties will be overwritten by ECU.

pushToStore

If you want to push the received data to the store, set this option to true

normalizeOperation

You can define how your outgoing data should be serialized


Exemplary data:
```js
{
  firstParam: 'My Name',
  colors: { rubyRed: 1, blueFish: 3 }
}

After using a dasherize transformer our request data will turn into:

{
  first-param: 'My Name',
  colors: { ruby-red: 1, blue-fish: 3 }
}

It's great for API with request data format restrictions

Available transformers:

  • camelize
  • capitalize
  • classify
  • dasherize
  • decamelize
  • underscore

adapterOptions

Pass custom adapter options to handle them in urlForCustomAction in case of using customAction. Required usage of mixin: AdpaterMixin

responseType

You can easily observe the returned model by changing responseType to array or object according to what type of datayour server will return.

When array:

model.customAction({}, { responseType: 'array' }) // returns DS.PromiseArray

When object:

model.customAction({}, { responseType: 'object' }) // returns DS.PromiseObject

When null (default):

model.customAction({}, { responseType: null }) // returns Promise

null is useful if you don't care about the response or just want to use then on the promise without using binding or display it in the template.

queryParams

You can pass a query params for a request by passing an {} with properties, eg: { include: 'owner' }** Remember: Query params are not normalized! You have to pass it in the correct format. **

Development

Installation

  • git clone https://github.com/Exelord/ember-custom-actions.git
  • cd ember-custom-actions
  • npm install

Linting

  • npm run lint:hbs
  • npm run lint:js
  • npm run lint:js -- --fix

Running tests

  • ember test – Runs the test suite on the current Ember version
  • ember test --server – Runs the test suite in "watch mode"
  • ember try:each – Runs the test suite against multiple Ember versions

Running the dummy application

For more information on using ember-cli, visit https://ember-cli.com/.

Thanks

Big thanks to Mike North and his Project for the initial concept.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/exelord/ember-custom-actions. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

This version of the package is available as open source under the terms of the MIT License.

  • 出现这个错误的原因是请求回来数据时直接跳转,没有dispatch 比如这样会出现错误: export const getWithdrawCheck = () => { const userId = getStore('customerUserId', 'session') const userPhone = getStore('userPhone', 'session') const

  • use custom middleware for async actions explain 当使用异步加载的时候需要加入插件thunk,插件需要传入applyMiddleWare方法,如果这个时候还加入了devtool插件,applyMiddleWare(thunk)必须要放在devtool()的前面,否则会报错。 ref http://stackoverflow.com/questions/

  • 这个问题网上有很详细的解释,这里我只说下我引起这个问题的原因。 我将Redux中的actoin封装到一个函数中后,在组件的一个方法中使用这个函数: const getChangeInputValueAction = (value) => { type: CHANGE_INPUT_VALUE, value }; handleInputChange(e) { const action =

 相关资料
  • JSF为开发人员提供了强大的功能来定义自己的自定义标记,可用于呈现自定义内容。 在JSF中定义自定义标记分为三个步骤。 步 描述 1a 创建一个xhtml文件,并使用ui:composition标签在其中定义内容 1b 创建标记库描述符(.taglib.xml文件)并在其中声明上面的自定义标记。 1c 在web.xml中注册标记libray描述符 步骤1a:定义自定义标签内容:buttonPane

  • 自定义Drawables > 原文链接 : Custom Drawables 原文作者 : Ryan Harter 译文出自 : 开发技术前线 www.devtf.cn 译者 : SwinZh 校对者: Mr.Simple 状态 : 完成 我们都看过关于为什么你应该适当的使自定义Views和如何能帮助你正确的封装你的应用程序代码的帖子。但非视图相关的部分如何转化为我们apps的其他部分的这种思考方

  • The alter method can be used if you want to insert or remove rows and columns using external buttons. You can programmatically select a cell using the selectCell and load new data by loadData function

  • Registering a renderer Rendering custom HTML in cells Rendering custom HTML in header Registering a renderer When you create a renderer, a good idea is to assign it as an alias that will refer to this

  • You can easily pass id and other attributes to the hot-table wrapper element. It will be applied to the root Handsontable element, allowing further customization of the table.// app.component.ts impor

  • A plugin contains one or more features that can be easily plugged in to Handsontable. Writing a new plugin is not a difficult task, simply cloning the Skeleton template will give you a good starting p