検索
ホームページウェブフロントエンドjsチュートリアルAngularJS_AngularJS を使用したシンプルな RSS リーダーの作成に関するチュートリアル

はじめに

数年前、C# で RSS リーダーを作成しましたが、SPA (シングル ページ アプリケーション) にしたら良いのではないかと考えました。 Angular を使用するといくつかの作業が簡単になります。RSS リーダーもその 1 つです。 また、RSS リーダーを実装するために Twitter Bootstrap (UI 用) を使用しました。ページ スタイルのデバッグは、おそらく CSS が苦手なため、最も難しい部分の 1 つです。

背景

私にはお気に入りの Web サイトがいくつかあります (CodeProject、Dr.Dobb's Journal、ComputerWorld, Inc. Magazine)。 しかし、これらのサイトの多くには、煩わしい広告やレイアウトが悪く、本当に見たくないものがあることがわかりました。これを言うとき、私は CodeProject Web サイトを含めません。


これらのサイト間を行ったり来たりするのに多くの時間が無駄になります。 したがって、私は記事のタイトルと紹介文を参照して、記事のコンテンツページに入るかどうかを決定することを好みます。 これが、FreedReadR シングルページ アプリケーションを作成することにした理由です。

FreedReadR は、読み込むデータ (RSS ソース) の量が比較的少ないため、応答が速くなります。

以下は、「CodeProject」オプションをクリックした場合のレンダリングです:

2015618104337323.png (503×485)

以下は、特定のサイトからデータを読み込む FreedReadR のレンダリングです:

2015618104359104.png (773×500)

今すぐエフェクトを試すことができます:

http://newtonsaber.com/FreedReadR

ほとんど忘れていましたが、独自の RSS リーダーを作成する前に Google でこのアイデアを検索し、jsfiddle でより良いコードを見つけました: angularJS Feed Reader alt.


私のコードはそのコードに似ていますが、より多くの機能を実装したいため、それでも異なります。 FreedReadR を使用すると、独自の RSS フィード データをローカルに保存できるため、いつでもアプリケーションを使用してカスタム RSS フィードを作成できます。 さらに、そのコードは Twitter Bootstrap 2 に基づいており、FreedReadR は新しいバージョンの Twitter Bootstrap 3 に基づいています。
コードを使用

Angular に精通していれば、開発する際のコードはそれほど多くありません。 難しい部分のほとんどは、Angular で Bootstrap を使用することです。

その他の問題は、「Angular Programming Thoughts」で解決できます。 $scope の使用法は、コントローラーの動作方法とは少し異なります。 まず、HTML でアプリケーションのスコープを設定する必要があります。 ng-app="FreedReadR" を使用した次のようなコードは、HTML の $scope のスコープを設定します。つまり、div タグ内のすべてのオブジェクトです。以下の例では、スコープはページ全体です。 アプリケーション ロジック全体を処理するのに必要なコントローラーは 1 つだけであり、これには比較的満足しています。

<body ng-app="FreedReadR">
 
<div data-ng-controller="FeedCtrl">
  <h4 id="RSS-Feed-Reader-using-AngularJS">RSS Feed Reader using AngularJS</h4>
 
<form class="form-horizontal col-md-12" role="form">
 <div class = "row">
  <div class="col-md-6">


上記の HTML コードでは、Angular アプリケーション テンプレートの名前が FreedReadR であることがわかります。 アプリケーション テンプレートを設定し、コントローラー (FeedCtrl) コードを追加するときに、main.js ファイルで同じ名前を使用しました。パラメータを設定する main.js のコードを見てみましょう。

var app = angular.module('FreedReadR', []);
 
app.factory('FeedService',function($http){
 return {
  parseFeed : function(url){
   return $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load&#63;v=1.0&num=50&callback=JSON_CALLBACK&q=' + encodeURIComponent(url));
  }
 }
});
 
app.controller("FeedCtrl", ['$scope','FeedService', FeedCtrl]);

上記の js コードの最初の行は、AngularJS アプリケーション テンプレートを作成することです。 その名前は FreedReadR であり、このテンプレートを参照するために HTML コード内で同じ名前を使用していることに注意してください。

次に、Angular ファクトリ クラスを作成します。これは、後で RSS ソース URL にアクセスして実際のソース データを取得するために使用されます。 コードで使用されている $http.jsonp リクエストを注意深く見てください。 URL の形式は次のとおりです:

//ajax.googleapis.com/ajax/services/feed/load&#63;v=1.0&num=50&callback=JSON_CALLBACK&q=

URL里调用了Google API,以前我并不知道Google API。这就是我在文章开头提到的jsfiddle示例的主要代码。 如果你想更多地了解Google API,你可以在这里下载:https://developers.google.com/feed/v1/jsondevguide。

在上面的js代码中,你会发现我们调用了encodeURIComponent 函数,它是用来转换URL的。
配置Angular 控制器

控制器用来处理应用程序的逻辑,因此大部分js函数应该在控制器内部。这就是Angular 帮助你组织(混乱的)js代码的方式。 我刚有大声说出来吗?


好吧,JavaScript鼓励杂乱无章,不是吗?这是它不好的地方.提到JavaScript的全局变量的时候,你不用带着恐惧尖声叫喊着说吗?如果不用,那么我们可能要撤销你的开发者许可证.你有编写软件的许可,不是吗?(译者注:因为你有开发者许可证,所以你自然也是带着恐惧尖声叫喊着说JavaScript的"全局变量"的--这里有些夸张的说法,意在说明开发者对于JavaScript的"全局变量"的使用应该有所顾忌.)

现在,在我们深入了解应用程序具体做了些什么的时候,看看控制器提供的功能.看看在控制器中的每个函数,以便了解FreedReadR可以做些什么.
检查localStorage, 存在则加载

我想做的一件事是,希望你在浏览器的slocalStorage中保存你的源.我不希望因为设置数据库而弄得一团糟,但我希望你可以增加自定义的源,并且让他们在你的浏览器中一直可用.
 
localStorage的限制

当然,localStorage的限制是,它存在于一个特定浏览器的给定域名.

这意味着,如果你从NewtonSaber.com/FreedReadR运行应用程序并保存一些自定义的源,当你从浏览器打开最初打开的连接的时候,你将会再次只看到列表中的这些内容.每个浏览器的localStorage都是私有的.所以,如果你某天使用IE增加了一些源,在接下来的一天将无法使用Chrome来查看已经添加的源.

对我来说,这个版本的应用程序已经OK了.因为它是我所希望的,用非常快速和了解其限制的技术开始.修正限制可能是以后另一篇文章的事情了.


你会发现在控制器代码中,我首先调用了一个函数:retrieveFromLocalStorage()。

函数如下:
 

function retrieveFromLocalStorage()
 {
  $scope.allFeeds = [];
  console.log("retrieving localStorage...");
  try
  {
  $scope.allFeeds = JSON.parse(localStorage["feeds"]);
  console.log($scope.allFeeds.length);
 
  // console.log(JSON.stringify($scope.allFeeds));
  if ($scope.allFeeds === null)
  {
   console.log("couldn&apos;t retrieve feeds" );
   loadDefaultFeeds();
  }
  }
  catch (ex)
  {
  console.log("ex: " + ex);
  loadDefaultFeeds();
  saveToLocalStorage($scope.allFeeds);
  }  
 }

这是一个非常简单的函数。 它在 $scope的作用域内定义了一个名为 allFeeds的数组变量。 然后,通过 JSON.parse方法从localStorage数组中读取一个 feeds对象,这个对象保存的是已存在的 RSS源。如果这个 feeds对象为 undefined(这是首次运行应用程序),程序会抛出一个异常。 当异常被抛出时,应用程序会加载一些默认的 RSS源(loadDefaultFeeds()),然后将这些源保存到localStorage中供下次使用。


先看看loadDefaultFeeds()函数,然后我们再看saveToLocalStorage()函数.
 

function loadDefaultFeeds()
{
 $scope.allFeeds = [{titleText:"Load (from textbox)",url:""},
 {titleText:"CodeProject C#",url:"http://www.codeproject.com/webservices/articlerss.aspx&#63;cat=3"}, {titleText:"ComputerWorld - News",url:"http://www.computerworld.com/index.rss"},
 {titleText:"Dr. Dobb&apos;s",url:"http://www.drdobbs.com/rss/all"},
 {titleText:"InfoWorld Today&apos;s News",url:"http://www.infoworld.com/news/feed"},
 {titleText:"Inc. Magazine",url:"http://www.inc.com/rss/homepage.xml"},
 {titleText:"TechCrunch",url:"http://feeds.feedburner.com/TechCrunch"},
 {titleText:"CNN",url:"http://rss.cnn.com/rss/cnn_topstories.rss"}
     ];
}

就像你所看到的,我增加了一些我最喜欢的源,这样,你就可以很容易的试用这个应用程序.它仅仅只是一个对象数组,通过titleText和url来定义.

只要它们都加载到$scope类型的变量allFeeds之中,你就可以使用ng-repeat从HTML获取它们了,它看起来像下面这样:
 

<li ng-repeat="feed in allFeeds">
 <a href="#" ng-click="loadFeed($event,feed.url);">{{feed.titleText}}</a>
</li>

这创建了选项的列表,当你点击下拉框按钮的时候,它们将会显示在上面.如你所看到的,我们在ng-repeat语句中引用了allFeeds $scope变量,然后我们引用了feed.titleText来生成入口.


现在你的按钮已经加载了很好的标题了。

我说过会给你介绍saveToLocalStorage()方法,现在让我们看一看。
 

function saveToLocalStorage(feeds)
 {
  // Put the object into storage
 
  localStorage.setItem(&apos;feeds&apos;, angular.toJson(feeds));
  console.log(angular.toJson(feeds));
  console.log("wrote feeds to localStorage");
 }

这是一个非常简单的方法。方法允许你传入  feeds 对象(这应该是一个feed对象数组)。然后我们简单地调用  localStorage.setItem( ) 方法。正如方法的名字所说,我们可以用该方法来保存对象。要注意的是,当我们保存对象的时候,我们会调用对象的  angular.toJson()  方法。这是个方法会帮助我们去除一些angular特有的属性,而这些属性是我们不想保存的。所以调用这个方法非常重要,因为angular会在对象中保存一些特有属性,这些属性会让你感到迷惑。

现在,应用程序已经加载了一些默认的RSS源,如果你想获取某一个RSS源的数据,点击下拉框按钮,选择其中一个值,然后应用程序会运行下面的代码来获取相关的数据。 我们在$scope作用域内添加一个loadFeed函数,函数如下。 下面的函数会被调用,因为我们在html中给按钮绑定了事件ng-click="loadFeed($event,feed.url);"。


loadFeed=function(e,url){
  $scope.currentButtonText = angular.element(e.target).text();
  // 清空过滤文本框中的上次展示的信息,
  // 当我们选择一个新的RSS源时,如果不清空会让人疑惑
  $scope.filterText = "";
  console.log("loadFeed / click event fired");
 
  if ($scope.currentButtonText == $scope.allFeeds[0].titleText)
  {
   //console.log($scope.feedSrc);
   url = $scope.feedSrc;
  }
 
   
  $scope.feedSrc = url;
  if (url === undefined || url === "")
  {
   $scope.phMessage = "Please enter a valid Feed URL & try again.";
   return;
  }
  console.log("button text: " + angular.element(e.target).text());
  console.log("value of url: " );
  console.log(url);
  FeedService.parseFeed(url).then(function(res){
   $scope.loadButonText=angular.element(e.target).text();
   $scope.feeds=res.data.responseData.feed.entries;
  });
 }

通过点击事件调用上面的函数时,我们先判断用户选择的信息与下拉框第一个选项 "Load (from textbox)"是否相同。 这么做是为了判断用户是否想加载文本框中提供的 RSS源。 如果是这样,我们调用FeedService.parseFeed  方法时,直接传入文本框中 URL值。如果不是这样,我们从相关的源对象中获取 URL。

结果列表

当源信息返回的时候,HTML代码使用另一个ng-repeat来迭代遍历每个项,并用友好的格式显示它们.HTML代码看起来像下面这样:
 

<ul class="unstyled">
 <span class="badge badge-warning top-buffer" ng-show="feeds.length > 0">{{(feeds | filter:filterText).length}} Items</span>
 <li ng-repeat="feed in feeds | filter:filterText">     
  <h5 id="a-href-feed-link-target-blank-span-class-titleText-feed-title-span-a-span-class-small-feed-publishedDate-span"><a href="{{feed.link}}" target="_blank"><span class="titleText" >{{feed.title}}</span></a><span class="small"> {{feed.publishedDate}}</span></h5>          
  <p class="text-left">{{feed.contentSnippet}}</p>     
   
 </li>    
</ul>

HTML也创建了一个好友的标记,用来显示获取到的文本链接数.
搜索结果里的内容

它也显示了一个搜索文本框,可以用来输入文字,根据文本链接的内容来过滤下拉列表.
点击链接: 在新的页面加载

最后,如果你点击一个链接,它会在浏览器的新页面或窗口加载.这让这个工具很容易使用.

保存新的源

这个部分我做的很简单,因为我完成这个应用程序只是为了我自己使用.

如果你在文本框中输入一个URL,然后点击保存按钮(向下的箭头图标),你将看到一个JavaScript提示框,它看起来像下面展示的图片这样:

2015618104438205.png (445×159)

你可以简单的输入标题(它将显示在下拉列表中)用来标识新的源,然后点击OK按钮.

只要你这么做了,这个项就会增加到下拉列表.这个过程通过增加这个项到allFeeds对象来实现,同时,这个项也将立即保存到localStorage之中.

这就是所有的内容.

希望你和我一样喜欢这个工具,它节省了很多时间.

发布提示

请注意许多外部库的链接是CDN的,除了下载的Bootstrap文件,其他下载的文件在一个3rdPartyLibs(第三方库)的目录里。你可以下载代码,解压和运行它们。
为本地存储准备Web服务器是必需的

你必须运行一个web服务器使它正常工作。注意,在下载的文件中已经包含一个精致小巧的web服务器(mongoose web server)和配置文件,因此,如果你希望使用它,你可以双击mongoose.exe,它就开始运行了,之后,你可以简单地加载: http://localhost:999/FreedReadR/ 它就从你的电脑上运行了。
 
最后一个要注意的是:那个【X】按钮是什么?

保存按钮后面的那个[X]按钮是什么?那个按钮允许你释放所有来自你的localStorage的反馈。如果你点击它,它们会被移除。被命名为反馈的localstorage条目就这样简单地被销毁了,所以要小心处理。如果你在添加任何反馈之前使用这个按钮,没有任何问题,否则你将会失去你已经添加的反馈。

我很懒,我使用它仅仅是为了我的测试,你还是应该把它去掉的。懒惰还真是一个伟大开发者的标志啊。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません