我整理了一个小的 JSFiddle,展示了来自 RxJS-Angular Extensions Project 的修改示例。 编辑 我的第一个示例与点击事件资源中的示例非常相似。我让这个例子稍微复杂了一点,它使用 Subject 来发布和订阅由返回承诺的工厂处理/修改的数据。
版本说明: Rx-Angular,截至 2017 年 9 月 28 日,仅支持 RxJS 版本 4。RxJS 是 RxAngular 的依赖项,所以要小心,否则会遇到无法解决的错误。
不过,简而言之,我的答案是使用 Rx-Angular 扩展库。部分原因是 RxJS 是 Angular-RX 的依赖项,所以无论如何你都会拥有它并且可以同时使用它们。但也因为它允许进行一些有用的简单 Observable 制作,例如事件或“$watches”。
https://jsfiddle.net/ejmLpyrn/3/
HTML
<div ng-app="myApp" ng-controller="appCtrl">
<!-- RxJS v4.1.0, RxAngular v1.5-->
<div class="jumbotron">
<div class="form-group">
<input type="text" ng-model="query" />
<button type="button" ng-click="clickFunction()">
Search
</button>
</div>
</div>
<hr>
<div>{{message}}</div>
</div>
JS
angular.module('myApp', ['rx'])
.factory('subjectProxyService', function () {
var subjectProxyService = {};
var subject = new Rx.Subject();
subjectProxyService.subject = function () {
return subject;
}
return subjectProxyService;
})
.factory('appFactory', function(rx) {
function addContextToMessage(query) {
var deferred = $.Deferred();
var timestamp = moment().format("YYYY-MM-DD");
var _msg = "[" + timestamp + "]" + query;
deferred.resolve(_msg);
return rx.Observable
.fromPromise(deferred.promise())
.map(function(contextMsg) {
return contextMsg;
});
}
return {
addContextToMessage: addContextToMessage
};
})
.controller('appCtrl', function($scope, rx, appFactory, subjectProxyService) {
$scope.query = "";
$scope.message = "";
subjectProxyService.subject().subscribe(
function (x) { console.log('Value published to observer: ' + x); },
function (e) { console.log('onError: ' + e.message); },
function () { console.log('onCompleted');
});
$scope.$createObservableFunction('clickFunction')
.map(function () {
return $scope.query;
})
.flatMapLatest(appFactory.addContextToMessage)
.map(function(results) {
return results;
})
.subscribe(subjectProxyService.subject());
// give the service-subject as the subscriber to the "click stream"
})
你当然可以在 Angular 中编写纯 RxJS,但如果你真的想要的话,你也可以在你的 Angular 应用程序中编写大部分的 jQuery。只要加载了所有库,您就只是在 Angular 中运行 JavaScript。不过,我认为使用 Angular 扩展主要是最佳实践和未来智能,您也可以期望它支持 Angular 和 RxJS 更改。更不用说,他们花时间编写了一堆经过测试的帮助器和构造器方法,您不必自己编写——比如将 $scope 变量上的 $watch 映射/链接到 Observable。
资源
这里有更多关于 Rx-Angular 的资源。例如,您可以使用 3 个有用的方法在 Angular 中创建 Observables。它们基本上是 RX Observables 的有用构造方法(所以你不必自己编写!):
-
$toObservable
$toObservable - $scope variables
-
$eventToObservable
$eventToObservable - $events
-
$createObservableFunction
$createObservableFunction - binding functions in scope to an Observable, like ngClick
-
在 RxJS 中使用主题
Subjects AS-A Service