- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用的格式是
{product._id:{product._id:string, product_name:string}, product._id:{product._id:string, product_name:string}}
保存我商店的产品信息
一切正常,加载时我设置了它:
function handleBlogsLoadedAction(state, action) {
const returnedBlogs = action.payload
const blogObj = returnedBlogs.reduce(
(blogs: { [id: string]: Blog }, blog: Blog) =>
{
return Object.assign(blogs, { [blog._id]: blog });
}, {});
let newState = Object.assign({}, state);
newState = {
loaded:true,
blogs:blogObj
}
return newState;
}
所以我最终得到了类似的东西:
{"12345":{product._id:"12345", product_name:"product1"}, "6789":{product._id:"6789", product_name:"product2"}}
我更新和删除了它,但是当涉及到添加时,问题是在创建后获取 id 的最佳方式,这样我就可以插入状态
关键是我不想自己生成id,数据库必须自己做
有没有人知道最佳实践或者只是对如何做到这一点有一些想法
编辑:
很抱歉,问题比上面说明的要复杂一些。
@danday74 的回答是正确的,但我的问题问得不好,我想我应该分享和详细说明,希望能帮助到其他人。
我的商店也使用 websocket 与其他客户端通信,@Effect() beginUpdate$
监听操作:
BLOG_UPDATE_START_ACTION、BLOG_DELETE_START_ACTION、BLOG_ADD_START_ACTION
当 beginUpdate$ 被触发时,为套接字主题调用下一个方法
this.socketService.socket$.next(JSON.stringify(action))
它携带/发送 Action 到连接的客户端,然后从 beginUpdate$ 分派(dispatch)一个 Action 来更新数据库。
您可以看到这里出现的问题,我需要按照@danday74 所述更新数据库然后将返回的数据发送到商店
所以最后我所做的是调用下一个方法调用,它在一个 do 函数中,并将它添加到进行 HTTP 调用的效果中,所以下一个方法是用服务器的响应调用的
我还设置了监听socket的效果:
@Effect() watchSocket$ = this.socketService.socket$
当通过套接字发送操作时,它会分派(dispatch)更新状态的操作,但现在具有正确的负载。
将 websocket 实现到 ngrx 是一个学习曲线,例如,我最初使用 watchSocket$ 效果返回一个将进行 HTTP 调用的操作,然后分派(dispatch)一个操作来更新状态,
但是因为来自 watchSocket$ 的操作被分派(dispatch)给所有客户端,所以每个客户端都会尝试发出相同的 HTTP 请求,想象一下有 100 个客户端试图删除相同的项目!
所以我分成了 2 个效果,一个是更新数据库(HTTP 请求)
将响应发送到套接字,套接字更新所有连接的商店。
如果有人可以就最佳实践提出任何建议,请随意
//Effects that make HTTP requests
@Effect({dispatch:false}) updateDB$: Observable<any> = this.actions$
.ofType<fromBlogActions.BlogUpdateDBAction>(fromBlogActions.BLOG_UPDATE_DB_ACTION)
.mergeMap(action => {
console.log(action)
return this.blogService.updateBlog(action.payload.blog)
})
.do((blog:Blog)=> this.socketService.socket$.next(JSON.stringify({type:fromBlogActions.BLOG_UPDATE_START_ACTION, payload:{blog:blog}})))
@Effect({dispatch:false}) deleteBlogFromDB$: Observable<any> = this.actions$
.ofType<fromBlogActions.BlogDeleteDBAction>(fromBlogActions.BLOG_DELETE_DB_ACTION)
.mergeMap(action => {
console.log(action)
return this.blogService.deleteBlog(action.payload.blog)
})
.do((blog:Blog)=> this.socketService.socket$.next(JSON.stringify({type:fromBlogActions.BLOG_DELETE_START_ACTION, payload:{blog:blog}})))
@Effect({dispatch:false}) addBlogToDB$: Observable<any> = this.actions$
.ofType<fromBlogActions.BlogAddToDBAction>(fromBlogActions.BLOG_ADDED_TO_DB_ACTION)
.mergeMap(action => {
console.log(action)
return this.blogService.addBlog(action.payload.blog)
.catch(()=>{
return Observable.of({})
})
})
.do((blog:Blog)=> this.socketService.socket$.next(JSON.stringify({type:fromBlogActions.BLOG_ADD_START_ACTION, payload:{blog:blog}})))
// Effects to update state
@Effect() deleteBlog$: Observable<any> = this.actions$
.ofType<fromBlogActions.BlogDeletedAction>(fromBlogActions.BLOG_DELETED_ACTION)
.map((action)=>new fromBlogUIActions.CrudSucessAction(action))
@Effect() updateBlog$: Observable<any> = this.actions$
.ofType<fromBlogActions.BlogUpdatedAction>(fromBlogActions.BLOG_UPDATED_ACTION)
.map((action)=>new fromBlogUIActions.CrudSucessAction(action))
@Effect() addBlog$: Observable<any> = this.actions$
.ofType<fromBlogActions.BlogAddedAction>(fromBlogActions.BLOG_ADDED_ACTION)
.map((action)=>new fromBlogUIActions.CrudSucessAction(action))
// Updates Database (CRUD)
@Effect() beginUpdate$: Observable<Action> = this.actions$
.ofType(fromBlogActions.BLOG_UPDATE_START_ACTION, fromBlogActions.BLOG_DELETE_START_ACTION, fromBlogActions.BLOG_ADD_START_ACTION)
.map((action:any)=>{
//Update database, but doing it here makes sure it's only done once
if (action.type === fromBlogActions.BLOG_UPDATE_START_ACTION) {
return new fromBlogActions.BlogUpdateDBAction(action.payload);
}
if (action.type === fromBlogActions.BLOG_DELETE_START_ACTION) {
return new fromBlogActions.BlogDeleteDBAction(action.payload);
}
if (action.type === fromBlogActions.BLOG_ADD_START_ACTION) {
return new fromBlogActions.BlogAddToDBAction(action.payload);
}
})
// Watches websocket
@Effect() watchSocket$:Observable<any> = this.socketService.socket$
.map((action : any) => {
//Update state across clients
if (action.type === fromBlogActions.BLOG_UPDATE_START_ACTION) {
return new fromBlogActions.BlogUpdatedAction(action.payload)
}
if (action.type === fromBlogActions.BLOG_DELETE_START_ACTION) {
return new fromBlogActions.BlogDeletedAction(action.payload)
}
if (action.type === fromBlogActions.BLOG_ADD_START_ACTION) {
return new fromBlogActions.BlogAddedAction(action.payload)
}
})
最佳答案
所以你有两个 Action :
ADD_PRODUCT_REQUESTED(带负载)
此处的有效负载是 POST 请求的主体(见下文)。第一个操作会触发一个效果,向您的服务器发出后端 POST (CREATE) 请求。当后端请求完成时,效果会触发下面的第二个操作,将响应作为有效负载传递。(可选)第一个操作可能会在没有 ID 的情况下将数据插入存储,这样您就可以开始显示数据,而无需等待 HTTP 请求完成。
ADD_PRODUCT_COMPLETED(带负载)
这会从效果中接收有效负载,并使用相关 ID 将数据插入(或更新)存储中。
PS 你可能还想考虑使用 ngrx/entity 来简化集合的使用。
您可能已经习惯了操作和缩减器。如果您不熟悉 ngrx/effects,这里有一些示例代码可以执行此类操作:
@Effect()
allFiltersRequested$ = this.actions$.pipe(
ofType<BimRequestedAction>(BimsActionTypes.BimRequested),
tap((action) => debug(action)),
mergeMap((action) =>
// essential to catchError else an HTTP error response will disable this effect
this.bimService.getBim(action.payload).pipe(
catchError(() => {
return of({})
})
)
),
map((bim) => new BimLoadedAction(bim))
)
此处 bimService 正在发出 HTTP 请求。
关于angular - 如何获取新项目ngrx的id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51698944/
我有一个 Outlook 加载项,它是一个新的功能区选项卡,它连接到我的服务器数据库,用于将一些自定义数据与 Outlook 对象相关联。 此功能区选项卡目前显示在邮件项目中。 我正在扩展它以在任务和
我已经使用 MVC 从头开始创建了多个站点,但现在我的任务是迁移项目。 目前该站点有一个大型静态文件库 (*.html)。最终每个页面都将迁移到带有 View 和 Controller 的 MVC
我已经使用 Netbeans 几个月了并且非常喜欢它。我正在尝试启用一种方法来创建一个项目,该项目访问我服务器上的实时文件以进行更改。当我使用远程源创建项目时,它开始将所有服务器文件下载到我的计算机。
我想创建一个java项目(非Web)来利用Spring的特性,如依赖注入(inject)、事务数据、 Autowiring 等, 我想使用的一些功能: @服务 @Autowired @存储库 @事务性
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在 Windows 10 上使用 Angular-cli 创建一个 Angular 4 项目。 我按照https://www.npmjs.com/package/@angular/cli中提
我正在开发小型 Android 应用程序,我想在 ListView 上显示新添加的项目。我正在从存储在 ArrayList>() 中的数据库中获取项目。因为我使用了 SimpleAdapter 。我将
我在商店中有一个带有 CoreData 模型的应用程序,我想完全更改该应用程序(删除一些垃圾、组织、新的 CoreData 模型...等)。 所以我想重新开始并创建新项目,当我尝试将商店中的旧应用程序
全新安装 Phoenix,我尝试触发一个新项目,当我尝试运行服务器时,我遇到了: Unchecked dependencies for environment dev: * gettext (Hex
在安装了必要的包“node.js”后,我试图创建一个新的 react 项目,我按照教程中的指导运行了用于创建应用程序的代码,但应用程序没有创建。这是收到的错误消息。 $ npm install -g
我想听听你的建议。可以添加新项目以右键单击 OSX 吗?例如,我在 safari、TextEdit、Notes、Pages、Preview 中选择任何单词,我想将这个单词发送到服务器并获得响应。有可能
我正在尝试创建一个新项目,并且我想使用 NHibernate(特别是 Fluent NHibernate)。 我学习一项新技术的最大问题就是设置它,我在这方面遇到了很多困难。我开始看这个 (http:
我正在开始我的第一家独立营利企业。我很难决定使用哪种语言。我想用 Perl 编写我的应用程序,但我认为编译起来不够简单。如果我不用 Perl 编写,我会用 C++ 编写。 该应用程序将具有许多功能,包
我在工作中开始一个新的客户端/服务器项目,我想开始使用一些我一直在阅读的新技术,LINQ 和泛型是主要技术。到目前为止,我一直在使用 MySQL 开发这些类型的应用程序,因为客户不愿意为 MSSQL
我要为我的另一半开始一个项目;根据特定标准搜索考古图像的能力。 搜索这些条件的能力就在我的街道上,一个与某些元数据相关联的图像(或其文件路径)数据库。该界面将允许搜索元数据,然后显示带有缩略图 Vie
我觉得我要为此疯狂了。 我正在尝试使用 Foundation 5 开始一个新项目,但我遇到了一个与我的 git 存储库相关的非常奇怪的问题。我之前一直在使用 Foundation 4,我已经检查过我是
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 5 年前。 Improve
当我在 Intellij 中创建一个新项目时,我收到了这些错误消息,我真的不知道如何缓解或解决这个问题。 我目前使用的是 Intellij IDEA 15 有人知道这个错误吗? Unknown Err
我会假设这只是意味着我缺少依赖项,但我无法创建任何类型的项目(控制台应用程序、Web 应用程序、Windows 窗体等)。我正在运行 VS 2012 premium。 最佳答案 您可能正试图将您的项目
摘要 有人知道当建议中不存在输入的内容时如何让 UI Fabric React TagPicker 添加新项目吗? 我还想向服务发送 AJAX 请求,以便在后端添加新项目。 所需功能 当有人在选择器中
我是一名优秀的程序员,十分优秀!