我试图在angular2应用程序中对rxjs中的redux进行基本的重新实现。
此时它基本上只是我在互联网上找到的几件事情,this plunker代表角度DI,this for file structure,this for combineReducers,最后{{3 }}
有'我遇到的几个问题,但这是目前最大的问题: this for "redux in rxjs"
发生了什么:
index
和todos
各有一个路径console.log
中的数据看起来不错Object {type: "DELETE_TODO", id: 1}
而不是数组待办事项 这里是我在console.log
中描述的内容(也可以在YouTube视频中看到)
---- index loaded ----
index.js:33 map in index: Object {todos: Array[3]}
index.js:35 resp in index: Object {todos: Array[3]}
index.js:38 ---- index destroyed ----
todos.js:31 ---- todos loaded ----
todos.js:33 map in todos: Object {todos: Array[3]}
todos.js:35 resp in todos: Object {todos: Array[3]}
todos.js:45 ---- todos destroyed ----
index.js:30 ---- index loaded ----
index.js:33 map in index: Object {todos: Array[3]}
index.js:35 resp in index: Object {todos: Array[3]}
index.js:38 ---- index destroyed ----
todos.js:31 ---- todos loaded ----
todos.js:33 map in todos: Object {todos: Array[3]}
todos.js:35 resp in todos: Object {todos: Array[3]}
NgStore.js:49 Object {type: "DELETE_TODO", id: 1}
todos.js:33 map in todos: Object {todos: Array[2]}
todos.js:35 resp in todos: Object {todos: Array[2]}
todos.js:45 ---- todos destroyed ----
index.js:30 ---- index loaded ----
index.js:33 map in index: Object {type: "DELETE_TODO", id: 1}
index.js:35 resp in index: Object {type: "DELETE_TODO", id: 1}
在路线发生变化时,有什么可能导致观察者发生变化?
这里是回购observable它使用了最新的alpha(46)
答案 0 :(得分:3)
您错误地使用了RxJS
API。要修复代码,您应该做以下两件事:
scan
运算符。// services/NgStore.ts
this._subject = new BehaviorSubject().scan(rootReducer, initialState);
switch
语句中的条件以检查action
是否为空(例如=== undefined
):// reducers/todo.ts
export const todos = (state = [], action) => {
switch(action && action.type) {
// ...
}
};
PS 我不会删除那些不知道REDx已经在RxJS中实现的人的第一个答案。
答案 1 :(得分:1)
您不需要在redux
中实施rxjs
,因为它已在那里实施。 Observable::scan(accumulator, [seed])运算符与redux
执行的操作完全相同。这是一个简化示例(请参阅this plunk):
// store.js
import BehaviorSubject from '@reactivex/rxjs/dist/cjs/subjects/BehaviorSubject';
import reducer from './reducer';
export default new BehaviorSubject().scan(reducer, 0)
// reducer.js
export default function(state, action) {
switch (action && action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
// app.js
import {Component} from 'angular2/angular2'
import store from './store';
@Component({
selector: 'my-app',
template: `
<h2>{{ value }}</h2>
<button (click)="increment()">Increment</button>
<button (click)="decrement()">Decrement</button>
`
})
export class App {
constructor() {
store.subscribe(value => this.value = value);
}
increment() { store.next({ type: 'INCREMENT' }) }
decrement() { store.next({ type: 'DECREMENT' }) }
}
嗯,当然你可以重新发明轮子(至少只是为了好玩)。
答案 2 :(得分:1)
在黑暗中拍摄。路线变化是视野状态的变化。我敢打赌angular2会重新创建或更新你在路由器中配置的组件。你所描述的是:
我在Angular的经历是nill,但从我读到的内容来看,我的直觉是:
这是在黑暗中完全拍摄的,但你应该尝试在这些线上进行测试,至少要放弃这种可能性。