精华内容
下载资源
问答
  • 微软todo使用教程There are many great tutorials that walk you through creating apps, from simple todo lists to fully working web apps. But how do you start your own projects from scratch? Without the ...

    微软todo使用教程

    There are many great tutorials that walk you through creating apps, from simple todo lists to fully working web apps. But how do you start your own projects from scratch? Without the safety net of a tutorial, you might feel a bit lost on what to build, or even how to get started.

    从简单的待办事项列表到可以正常运行的Web应用程序,都有许多很棒的教程指导您完成应用程序的创建。 但是,如何从头开始自己的项目呢? 没有教程的安全网,您可能会对构建什么甚至入门感到有些迷茫。

    These are the steps I followed that helped me create my own projects when I was a junior developer — and also set me up with the skills I needed to become a software team lead. But first…

    这些是我初级开发人员时遵循的步骤,可帮助我创建自己的项目,同时还使我具备了成为软件团队负责人所需的技能。 但首先…

    当我可以按照教程学习时,为什么还要构建自己的项目? (Why build my own projects when I can follow tutorials?)

    Good question, curious reader! Tutorials are great up to a point, but creating your own projects gives sooo many other benefits:

    好问题,好奇的读者! 教程虽然很好,但是创建自己的项目还有很多其他好处:

    这让你想 (It makes you think)

    When sitting down and starting your own project, there are many things to think about.

    坐下来开始自己的项目时,有很多事情要考虑。

    • How do I start?

      我该如何开始?
    • What will it look like?

      看起来像什么?
    • What technologies do I need?

      我需要什么技术?

    And other stuff like that (we’ll talk about how to get started in a minute). This is exactly what your job as a developer will entail — designing a solution and seeing it through to the finish. Creating your own projects allows you to practice these skills, and will set you up for the start of your career.

    以及其他类似的内容(我们将在一分钟内讨论如何开始使用)。 这正是您作为开发人员所要做的工作-设计解决方案并彻底解决问题。 创建自己的项目使您可以练习这些技能,并为您的职业生涯做好准备

    您将遇到从未存在的问题 (You’ll encounter problems you never knew existed)

    Often when following a tutorial, you are exposed to the happy path — which is basically;

    通常,在学习教程时,您会遇到快乐的路 -基本上是这样;

    “OK we’re building a thing, here’s the steps to get the thing working, it works! Hurray! The End”

    “好,我们正在构建一个东西,这是使它工作的步骤,它可以工作! 欢呼! 结束”

    Which is great if you’re learning a new technology — plus it would be a pretty terrible tutorial if the thing you are building didn’t work at the end.

    如果您正在学习一项新技术,那就太好了;而且,如果所构建的东西最后没有用,那将是一个非常糟糕的教程。

    Unfortunately, the lives of web developer’s are not as straightforward as this. When you’re writing code, you will hit issues at some point. Plain and simple.

    不幸的是,Web开发人员的生活并非如此简单。 在编写代码时,有时会遇到问题。 干净利落。

    By creating your own projects, you’ll encounter problems naturally and it gives you a chance to practice overcoming them. This what developers do every day and practicing will make this a lot easier.

    通过创建自己的项目,您自然会遇到问题,并且有机会练习克服这些问题。 开发人员每天要做的和实践的操作将使此操作变得容易得多。

    很好玩,您将永远学到一些东西 (It’s fun & you’ll always learn something)

    We’re a lucky bunch, we developers. We can sit down to a laptop, and build whatever we want, using whatever technology we want. We can also do it more or less for free. I doubt Bill the Aerospace engineer would get a good response from his boss if he asked, “to borrow that Boeing 747 for the weekend because he wants to try out a new jet engine he made at home”.

    我们是开发人员,是一群幸运儿。 我们可以坐在笔记本电脑上,使用所需的任何技术构建所需的任何东西。 我们也可以或多或少地免费这样做。 我怀疑航空航天工程师比尔是否会得到老板的好评,如果他要求“周末借用那架波音747飞机,是因为他想试用自己在家制造的新型喷气发动机”。

    It’s fun to build your own projects. Something you can use, show off to friends and family, or learn from. And it’s a pretty safe hobby. It might work, it might not. You might like it, you might f*** the whole thing up. But it’s not a big deal, just throw the project files in the virtual trashcan and start again. Easy!

    构建自己的项目很有趣。 您可以使用的东西,向亲朋好友炫耀或学习的东西。 这是一个非常安全的爱好。 它可能会起作用,但可能不会起作用。 您可能会喜欢,您可能会整个搞砸。 但这没什么大不了的,只需将项目文件放入虚拟垃圾桶中,然后重新启动即可。 简单!

    谈到好东西... (On to the good stuff…)

    Ok! Now we’re happy that creating our own project’s is a great way to learn and have fun. Let’s look at how to get started creating your very own projects.

    好! 现在,我们很高兴创建自己的项目是学习和娱乐的好方法。 让我们看看如何开始创建自己的项目。

    扩展您的教程项目 (Expand on your tutorial projects)

    There is something intimidating about starting a brand new piece of work. You’ll sit down to a new file, and think, “what do I do first?” The nicer way to start building your own projects is to build upon your existing tutorial apps and coding exercises. This gives you a bit of a head start, as opposed to starting from a blank slate.

    开始全新的作品有些令人生畏。 您将坐下来查看一个新文件,然后思考:“我首先要做什么?” 开始构建自己的项目的更好的方法是在现有的教程应用程序和编码练习的基础上进行构建。 相对于从空白开始,这为您提供了一些先机。

    So, if you have completed a todo app tutorial (if you haven’t, where have you been?!), you could build upon it in whatever way you want. For example, you could:

    因此,如果您已经完成了todo应用程序教程(如果尚未完成,您去哪儿了!!),则可以按照您想要的任何方式来构建它。 例如,您可以:

    • Allow saving the todo list (to a database, localStorage, etc) so the user can come back it later

      允许保存待办事项列表(保存到数据库,localStorage等),以便用户稍后再返回
    • Give the user some customization options (change the color of todo items)

      为用户提供一些自定义选项(更改待办事项的颜色)
    • Add login ability

      添加登录功能

    You get the idea — basically, use your imagination! The possibilities are endless, so throw caution to the wind and build whatever you feel like!

    您知道了-基本上,请发挥您的想象力! 可能性是无止境的,因此请谨慎对待并建立自己想要的任何东西!

    构建您将使用的东西 (Build stuff you’ll use)

    Everyone has their own ideas for a web app. Use your newly found web development skills to build your own! Write down some ideas for an app that you’ve had over the years, specifically those that you would actually use. It doesn’t have to be an overly complex app and can be as simple as a todo list.

    每个人对于Web应用程序都有自己的想法。 使用您新发现的Web开发技能来构建自己的技能! 写下您多年来使用过的应用程序的一些想法,尤其是您实际使用的想法。 它不必是一个过于复杂的应用程序,并且可以像待办事项列表一样简单。

    By creating an app that you’ll use, it’ll keep you interested enough to see the project through to completion. Also, by using the app once it’s finished, you’ll naturally find ways to make it better, which gives you another project to complete— and the circle of (coding) life repeats!

    通过创建您将要使用的应用程序,它可以使您足够有兴趣来观看项目直至完成。 此外,通过在应用程序完成后使用它,您自然会找到使其变得更好的方法,这使您可以完成另一个项目-重复(编码)生活的整个过程!

    Another similar approach, is to replicate a popular app that you use. You don’t have to go into the same level of detail as the app you are replicating, but see if you can get the basic functionality working. For example:

    另一种类似的方法是复制您使用的流行应用程序。 您不必进入与要复制的应用程序相同的详细程度,但是请查看是否可以使基本功能正常运行。 例如:

    • Use the GitHub API to create your own GitHub dashboard

      使用GitHub API创建自己的GitHub仪表板
    • Use the Twitter API and make your own Twitter feed

      使用Twitter API并创建自己的Twitter feed
    • A web app that allows you to manage your budget

      一个网络应用程序,可让您管理预算

    从小开始 (Start small)

    A sure fire way to get overwhelmed when starting your own projects is to go all out and try to create massive projects. While the ambition is good, you might find yourself getting stuck and frustrated at your progress.

    在开始自己的项目时,不知所措的肯定方法是全力以赴并尝试创建大型项目。 虽然雄心壮志不错,但您可能会发现自己对进度感到困惑和沮丧。

    Start small for your first few projects. Instead of making a fully fledged scientific calculator, create a basic one that does simple additions and subtractions, for example. Then as you become more comfortable, add new features. Before you know it, your small project will have turned into a fully fledged app.

    从头几个项目开始。 例如,与其制作一个成熟的科学计算器,不如创建一个基本的计算器,该计算器可以进行简单的加法和减法。 然后,当您变得更舒适时,添加新功能。 在不知不觉中,您的小型项目将变成一个成熟的应用程序。

    This also gives you the added benefit of practicing how software is built in the real world. Small features will often be developed, tested, and deployed in increments. This is typically called Agile Development (have a nosey at freeCodeCamp.org for more info about this).

    这也为您提供了练习如何在现实世界中构建软件的额外好处。 小型功能通常会逐步开发,测试和部署。 这通常被称为敏捷开发 (在freeCodeCamp.org上有些麻烦 有关此的更多信息)。

    有一个目标 (Have a goal in mind)

    There is a popular quote by Leonardo da Vinci:

    达芬奇(Leonardo da Vinci)的一句话很流行:

    Art is never finished, only abandoned.

    艺术永远不会完成,只会被放弃。

    The same can be said for software. Once you’ve started your own project, it can often be difficult to know when to keep going, and when to stop and move onto the next one. If you start with a goal in mind, it will give you something to aim for, as opposed to feeling like you are aimlessly wandering the desert.

    对于软件也可以这样说。 一旦开始自己的项目,通常很难知道何时继续进行,何时停止并继续进行下一个项目。 如果您以目标为出发点,那么它会为您提供目标,而不是像您在漫无目的的沙漠中徘徊。

    So what do I mean by a goal? A goal in this sense is basically what you want to achieve with your project. Instead of simply aiming to build a GitHub dashboard you could say:

    那么,目标是什么意思? 从这个意义上说,目标基本上就是您要在项目中实现的目标。 除了简单地旨在构建GitHub仪表板外,您还可以说:

    “I am going to build a dashboard that shows how many commits I’ve made to my own repositories last month.”

    “我将建立一个仪表板,以显示上个月我对自己的存储库进行了多少次提交。”

    This gives you a clear direction in which to work. Once you have reached that goal, you could add more features, or move onto another project. A goal can be anything you want:

    这为您提供了明确的工作方向。 一旦达到该目标,就可以添加更多功能或移至另一个项目。 目标可以是您想要的任何东西:

    BONUS TIP — remember to put everything onto your own GitHub repository, and state the goal in the description (you should put projects on your CV/Resume as well!). This will show employers that you are passionate about learning, and will also be good motivation for yourself when you look back on old projects!

    奖励提示—记住将所有内容放到您自己的GitHub存储库中,并在描述中说明目标( 您也应将项目放到CV / Resume中 !)。 这将向雇主表明您对学习充满热情,并且当您回顾旧项目时也将成为您的良好动力!

    示例项目尝试 (Example projects to try)

    Here’s some example projects to get your creative flow going.

    这是一些示例项目,可以使您的创意流程不断发展。

    (Quick note: I will be creating these projects myself, along with articles on how I did each one, how/why I made the decisions I made, and my general thought process. As well as completed code, of course. Make sure to subscribe to my blog to get updated when these articles are available!)

    (快速说明:我将自己创建这些项目,以及有关如何做每个项目,如何/为什么做出决定以及总体思考过程的文章。当然,还要完成代码。请确保当这些文章可用时,请订阅我的博客以获取更新!)

    计算器网络应用 (Calculator web app)

    Create a calculator that allows the user to perform basic operations: Add, subtract, multiply & divide. When you have got that far, you can build upon it:

    创建一个允许用户执行基本操作的计算器:加,减,乘和除。 当您走到这一步时,您可以在此基础上:

    • Add more scientific calculations (modulus etc)

      添加更多科学计算(模量等)
    • Improve the UI (HINT: CSS Grid will be your friend here)

      改善用户界面(提示:CSS Grid将是您的朋友)
    • Create “undo” functionality (HINT: the react tutorial has a good example of this)

      创建“撤消”功能(提示: react教程中有一个很好的例子)

    GitHub仪表板 (GitHub dashboard)

    Use the GitHub API to create your own dashboard. This dashboard can be anything you want. A possible starting point would be to display information about your own GitHub account.

    使用GitHub API创建自己的仪表板。 该仪表板可以是您想要的任何东西。 一个可能的起点是显示有关您自己的GitHub帐户的信息。

    • Total commits over the past month

      过去一个月的总提交次数
    • Total number of repositories

      储存库总数
    • Displays your most used/favourite language

      显示您最常用/最喜欢的语言

    HINT: Even though this is a client-side project, you will have to interact with an API. Use Postman or similar to get a feel for how the API works, how to authenticate requests and things like that.

    提示:即使这是一个客户端项目,您也必须与API交互。 使用Postman或类似工具来了解API的工作方式,如何验证请求以及类似的事情。

    测验应用 (A Quiz app)

    Create a quiz app that randomly displays a question with a multiple choice of answers to the user. If the user gets the answer correct, display a “hurray!” message, update their score, you get the idea. I like this app as the possibilities are endless when it comes to expanding on it:

    创建一个测验应用程序,该应用程序将向用户随机显示一个带有多种选择答案的问题。 如果用户正确回答,则显示“欢呼!” 消息,更新他们的分数,您就知道了。 我喜欢这个应用程序,因为扩展它的可能性是无限的:

    • Add categories

      添加类别
    • Add high scores

      增加高分
    • Add a countdown

      添加倒计时
    • Allow multiple players (HINT: You could go really advanced and use Socket.io to allow online play!)

      允许多个玩家(提示:您可以真正进阶,并使用Socket.io允许在线游戏!)

    HINT: Remember not to go overboard at the beginning! Set your goal for the initial project, and get to that point first. Then, see if you want to add more stuff or move onto something else.

    提示:切记不要一开始就太过分! 为初始项目设定目标 ,并首先达到目标。 然后,查看是否要添加更多内容或移至其他内容。

    实时天气应用 (A Real Time weather app)

    Use something like Open Weather Map to create an app that displays the latest weather for a certain location in real time.

    使用“ 打开天气地图”之类的工具来创建可实时显示特定位置最新天气的应用

    HINT: Try not to be put off by the term real-time. At its simplest level, this could be writing some logic that calls the api every 5 seconds and displays the data.

    提示:尽量不要被“实时”一词推迟。 在最简单的层次上,这可能是编写一些逻辑,该逻辑每5秒调用一次api并显示数据。

    We all know how shopping carts work, but can you build one? Display a list of products to the user, and let them add it to their cart. As a starting point, you could create functionality that:

    我们都知道购物车是如何工作的,但是您能制造一辆吗? 向用户显示产品列表,然后让他们将其添加到购物车中。 首先,您可以创建以下功能:

    • Let’s the user add an item from the product page to their cart

      让我们将产品页面中的商品添加到购物车中
    • Shows the items in the cart

      显示购物车中的物品
    • Show’s the total cost of the items in the cart

      显示购物车中物品的总费用

    HINT — You can simply hardcode the products that appear on the product’s page as a first step to get going.

    提示—您可以简单地对出现在产品页面上的产品进行硬编码,作为开始操作的第一步。

    更多项目! (More projects!)

    If you’re looking to get your hands on more projects, check out this GitHub repo . There are projects for different levels that will keep you busy for a while!

    如果您希望获得更多项目,请查看此GitHub存储库 。 有不同级别的项目会让您忙一阵子!

    Thanks for reading!

    谢谢阅读!

    To get the latest guides, tips, and courses for junior developers straight to your inbox (as well as some exclusive stuff!), make sure to join the mailing list at www.chrisblakely.dev!

    要直接为初级开发人员获取最新的指南,技巧和课程(以及一些独家的东西!),请确保加入www.chrisblakely.dev的邮件列表!

    Originally published at www.chrisblakely.dev on April 7, 2019.

    最初于2019年4月7日发布在www.chrisblakely.dev

    翻译自: https://www.freecodecamp.org/news/todo-tutorials-can-be-fun-but-heres-how-to-build-your-own-projects-from-scratch-de6838fa9f23/

    微软todo使用教程

    展开全文
  • 待办事项申请 这是的教程代码,用于使用Ruby on Rails创建简单的ToDo应用程序。 您可以找到以下链接的教程
  • Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行该应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何...
  • 使用Ionic2开发Todo应用

    2016-12-04 10:17:00
    本文使用Ionic2从头建立一个简单的Todo应用,让用户可以做以下事情: 查看todo列表 添加新的todo项 查看todo详情 保存 todo到持久化存储 0 开始之前 本教程需要你了解基本的Ionic 2概念。已经在电脑上安装了Ionic ...
        

    本文使用Ionic2从头建立一个简单的Todo应用,让用户可以做以下事情:

    • 查看todo列表
    • 添加新的todo项
    • 查看todo详情
    • 保存 todo到持久化存储

    0 开始之前

    本教程需要你了解基本的Ionic 2概念。已经在电脑上安装了Ionic 2。如果没有,先去安装和学习吧。

    1 创建新的Ionic 2工程

    我们将通过生成一个基于“空白”模板的新项目开始。这是一个空的项目框架,但有一些示例代码供我们使用。

    运行以下命令创建新项目

    ionic start ionic-todo blank --v2
    

    一旦代码生成,在文本编辑器打开项目。可以看到Ionic 2项目的基本结构, 这些是由Ionic CLI生成的代码。

    基本上,我们的应用程序中的所有组件(我们的应用程序将由不同的组件组成)将在** src ** 文件夹中(包括app文件夹中的根组件和在pages文件夹中我们所有的页面组件)。一个组件将包括一个模板(.html文件),类定义(.ts文件),或者一些样式(.scss文件)。同组件类似,您还可能创建诸如服务services(如稍后我们将创建的数据服务),但没有模板和样式,但在结构上类似一个正常的组件。这些服务也被称作“providers”将被放置在一个providers文件夹。

    现在,只有一个HomePage组件,设置一个虚拟视图。在我们的应用程序中我们要修改这个来显示的所有待办事项列表。

    先从自动生成的**src/app/app.component.ts文件开始来看一下:

    import { Component } from '@angular/core';
    import { Platform } from 'ionic-angular';
    import { StatusBar } from 'ionic-native';
     
    import { HomePage } from '../pages/home/home';
     
    @Component({
      template: `<ion-nav [root]="rootPage"></ion-nav>`
    })
    export class MyApp {
      rootPage = HomePage;
     
      constructor(platform: Platform) {
        platform.ready().then(() => {
          // Okay, so the platform is ready and our plugins are available.
          // Here you can do any higher level native things you might need.
          StatusBar.styleDefault();
        });
      }
    }
    

    app.component.ts文件中定义了根组件(root component)。相比其他组件该组件是特殊的,因为它是第一个组件被加载到应用程序,从那里我们可以显示更多的组件,可以添加更多的组件等等。基本上,我们的应用程序结构就像一棵树,根组件就是树的根。

    因此,重要的是我们的根组件(root component)知道在哪里可以找到我们的HomePage主页,因为需要将它设置为root page根页面。注意,我们导入(importing)HomePage** 在这个文件主页的顶部,然后在下面的代码中设置它作为根页面(** root page**):

    rootPage: any = HomePage;
    

    我们可以在构造函数上面声明变量,像上面这样的使其成员变量 member variables,这意味着他们可以通过引用this.myVal在整个类中被被访问,同时,它也将在您的模板中可用。** : any ** 只是一个TypeScript语言的内容,意味着rootPage可以是任何(any)类型。如果你不适应 TypeScript,并感到困惑,那也不用担心——你可以把类型抛开,您的应用程序仍然会工作的很好。我不会在本教程中使用类型,除了依赖注入是不可替代的地方(我们将稍后介入)。如果你想知道更多关于在Ionic 2中使用类型,应该学习TypeScript或ECMAScript 6相关知识。
    root page 根页面是您应用程序显示的第一个页面,然后你可以从这里导航到其他页面。改变Ionic 2应用程序中的视图可以通过改变这一根页面,或** push ** 推或 pop弹出视图。推一个视图将会改变展现,弹出它将删除当前视图并回到前面的视图。关于导航的更详细的解释,我推荐看看一个相关的Ionic 2导航指南。

    2. 设置主页(Home page)

    现在我们已经建立了基本的应用程序,让故事开始吧。首先,让我们建立todo列表模板。

    2.1 创建模板

    按照下面的内容修改 src/pages/home/home.html

    <ion-header>
      <ion-navbar color="secondary">
        <ion-title>
            Todos!
        </ion-title>
        <ion-buttons end>
            <button ion-button icon-only (click)="addItem()"><ion-icon name="add-circle"></ion-icon></button>
        </ion-buttons>
      </ion-navbar>
    </ion-header>
     <ion-content>
      <ion-list>
        <ion-item *ngFor="let item of items" (click)="viewItem(item)">{{item.title}}</ion-item>
      </ion-list>
    </ion-content>
    

    注意这里使用的语法在列表中使用ngFor,创建了一个速记到嵌入的模板中。这样就不用迭代输出了:

    <ion-item *ngFor="let item of items" (click)="viewItem(item)">{{item.title}}</ion-item>
    

    根据DOM(文档对象模型),嵌入式模板将会为每个项(items)创建特定的数据。所以,如果我们的items数组(稍后将定义在类定义)有4项,那么< ion-item >将渲染四次。还要注意,我们使用的** let item ,循环分配一个items数组项给item**。这允许我们引用其属性,并传递到viewItem函数。

    我们将标题设置为Todos(待办事项)!我们设计一个按钮使用< ion-buttons >。因为这里有个end属性,按钮将被放置在end的位置。不同属性的行为可能会有所不同,取决于在什么平台上运行,以iOS为例,将end会将按钮放到导航栏的右边。还要注意,按钮本身我们给它一个属性的ion-button将会使用Ionic 2 的按钮样式,而icon-only样式将会让按钮只包含一个图标没有文本。

    我们使用** (click) ** 来附加一个点击监听器到这个元素,这里将在在home.ts中调用addItem()函数。

    2.2 创建类

    按如下修改src/pages/home/home.ts

    import { Component } from '@angular/core';
    import { NavController } from 'ionic-angular';
     @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {
       public items;
       constructor(public navCtrl: NavController) {
       }
       ionViewDidLoad(){
         this.items = [
          {title: 'hi1', description: 'test1'},
          {title: 'hi2', description: 'test2'},
          {title: 'hi3', description: 'test3'}
        ];
       }
       addItem(){
       }
       viewItem(){
       }
     }
    

    还记得大明湖畔的夏雨荷吗?哦不是,还记得之前我们如何给homePage分配一个any类型变量吗?现在我们在构造函数中分配一个NavController类型给navCtrl参数。这就是Ionic 2 的依赖注入工作模式,基本上是一种方式告诉应用程序“我们希望通过navCtrl引用到NavController”。通过添加公共关键字在它面前,它会自动创建一个成员变量。这意味着我们现在可以引用NavController通过在类里任意使用this.navCtrl。

    现在我们已经建立了一些假的数据(我们使用ionViewDidLoad生命周期钩子,这将在页面加载时被触发),您应该能够看到它已经在列表中渲染了:

    3332945-f2dbe6e312de3c97.png
    Todos 列表页面

    在运行** ionic serve ** 时,因为既然我们导入了NavController服务,我们就可以在这个组件pushpop视图,如下所示:

    this.navCtrl.push(SOME_PAGE);
    

    或者

    ionic g page AddItemPage
    

    我们已经创建了添加和查看项目的方法,在更进一步之前我们不得不先创建 AddItemPage andItemDetailPage 组件。

    2.3 添加项目

    我们将要创建一个新组件让我们添加新的todo项。当然,这只是一个简单的表单提供了标题描述来创建todo。

    运行如下命令来生成一个add-item页面

    ionic g page AddItemPage
    

    任何时候当我们创建一个新页面,我们需要确保该页面被导入(imported)到我们的 app.module.ts,然后在entryComponents和declarations数组中被声明。

    按如下修改 src/app/app.module.ts

    import { NgModule } from '@angular/core';
    import { IonicApp, IonicModule } from 'ionic-angular';
    import { MyApp } from './app.component';
    import { HomePage } from '../pages/home/home';
    import { AddItemPage } from '../pages/add-item-page/add-item-page';
     @NgModule({
      declarations: [
        MyApp,
        HomePage,
        AddItemPage
      ],
      imports: [
        IonicModule.forRoot(MyApp)
      ],
      bootstrap: [IonicApp],
      entryComponents: [
        MyApp,
        HomePage,
        AddItemPage
      ],
      providers: []
    })
    export class AppModule {}
    

    就像上次,我们先创建组件的模版。

    2.4 建立新增项目模版

    按如下内容修改 src/pages/add-item-page/add-item-page.html :

    <ion-header>
      <ion-toolbar color="secondary">
        <ion-title>
            Add Item
        </ion-title>
            <ion-buttons end>
                <button ion-button icon-only (click)="close()"><ion-icon name="close"></ion-icon></button>
            </ion-buttons>
        </ion-toolbar>
    </ion-header>
     <ion-content>
        <ion-list>
           <ion-item>
            <ion-label floating>Title</ion-label>
            <ion-input type="text" [(ngModel)]="title"></ion-input>
          </ion-item>
           <ion-item>
            <ion-label floating>Description</ion-label>
            <ion-input type="text" [(ngModel)]="description"></ion-input>
          </ion-item>
         </ion-list>
         <button full ion-button color="secondary" (click)="saveItem()">Save</button> 
     </ion-content>
    

    这里没有什么太疯狂的开始。这次我们定义了另一个按钮,简单地调用了定义在add-item-page.ts中的saveItem函数。我们还有另一个按钮指向一个close方法——因为这个页面作为一个Mode模式的页面,我们希望能把页面关闭,所以我们也会在add-item-page.ts定义这个方法。
    现在我们有一些输入框了,它们又有[(ngModel)]属性,这个就是双向绑定。任何作用到title字段的改变都将立即影响到add-tiem-page.ts(我们马上要讲到)里面的this.title成员变量。反之亦然,任何this.title上的改变都将立即影响到模版。
    同样注意到我们的保存按钮上使用了full属性,这个方便的小属性帮助我们设置按钮宽度为full。

    2.5 建立添加项的类

    现在我们将要建立一个类给我们的添加项组件。

    按如下内容修改 add-item-page.ts

    import { Component } from '@angular/core';
    import { NavController, ViewController } from 'ionic-angular';
     @Component({
      selector: 'page-add-item-page',
      templateUrl: 'add-item-page.html'
    })
    export class AddItemPage {
       title;
      description;
       constructor(public navCtrl: NavController, public view: ViewController) {
       }
       saveItem(){
         let newItem = {
          title: this.title,
          description: this.description
        };
         this.view.dismiss(newItem);
       }
       close(){
        this.view.dismiss();
      }
     }
    

    这里我们导入了一个怪异的服务:ViewController,可以用于模态(Modals)页面的关闭(dismiss)。

    除此之外,我们创建了saveItem函数来创建newItem对象,它使用当前的标题描述值(即我们建立双向数据绑定,无论用户输入什么),然后我们关闭视图,同时我们也传入了newItem在dismiss方法中。这将允许我们建立一个侦听器,当回到主页(就是那个启动这个页面的另外一个页面)时获取数据。通过这种方式,我们可以从一个页面传递数据到另一个页面(然而,记住,模态不需要在页面之间传递数据)。

    2.6 在主页保存新增项

    就像我提到的,我们把要保存的数据返回发送给HomePage。我们现在导入import我们新增的AddItemPage组件到HomePage,当用户点击新增时我们就创建出该视图。

    按如下内容修改 src/pages/home/home.ts :

    import { Component } from '@angular/core';
    import { ModalController, NavController } from 'ionic-angular';
    import { AddItemPage } from '../add-item-page/add-item-page'
     @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {
       public items = [];
       constructor(public navCtrl: NavController, public modalCtrl: ModalController) {
       }
       ionViewDidLoad(){
       }
       addItem(){
         let addModal = this.modalCtrl.create(AddItemPage);
         addModal.onDidDismiss((item) => {
               if(item){
                this.saveItem(item);
              }
         });
         addModal.present();
       }
       saveItem(item){
        this.items.push(item);
      }
       viewItem(item){
       }
     }
    

    你看上面这个文件的顶部,可以发现我们现在导入importAddItemPage组件。这时我们就可以用这个页面创建模态页面了,具体看addItem方法。注意我们这里建立了一个onDidDismiss监听器,这样就可以获取模态关闭时回传的数据,并通过saveItem方法保存。现在,我们仅通过将数据push到items数组,最终,我们将保存到数据库。
    我们已经移除了假数据,因为现在用户输入通过saveItem方法被添加到了this.items。我们将items初始为空。

    2.7 查看项目

    现在,我们想要一个功能,就是用户点击todo列表里面的某一项,然后可以看到该项的细节信息(例如:这里只有描述可以看了,实际可以根据需要扩展,呵呵)。要做这个我们应该知道这是又要创建一个新组件了啊。

    还记得如何创建页面吗,运行下面的代码创建一个 item-detail 页面:

    ionic g page ItemDetailPage
    

    time and time again,我们需要在 app.module.ts 文件中设置一下,三件事:import,declarations, entryComponents:

    import { NgModule } from '@angular/core';
    import { IonicApp, IonicModule } from 'ionic-angular';
    import { MyApp } from './app.component';
    import { HomePage } from '../pages/home/home';
    import { AddItemPage } from '../pages/add-item-page/add-item-page';
    import { ItemDetailPage } from '../pages/item-detail-page/item-detail-page';
     @NgModule({
      declarations: [
        MyApp,
        HomePage,
        AddItemPage,
        ItemDetailPage
      ],
      imports: [
        IonicModule.forRoot(MyApp)
      ],
      bootstrap: [IonicApp],
      entryComponents: [
        MyApp,
        HomePage,
        AddItemPage,
        ItemDetailPage
      ],
      providers: []
    })
    export class AppModule {}
    

    按照顺序是该写模版了,开始:

    千篇一律,按照下面的内容自行修改 src/pages/item-detail-page/item-detail-page.html :

    <ion-header>
      <ion-navbar color="secondary">
        <ion-title>
          {{title}}
        </ion-title>
      </ion-navbar>
    </ion-header>
    <ion-content>
      <ion-card>
        <ion-card-content>
          {{description}}
        </ion-card-content>
      </ion-card>
    </ion-content>
    

    相比其他模版,这里相当的直白。我们只是使用< ion-card >指令简单装饰下,并输出标题和描述,值将在item-detail-page.ts中定义。

    好,继续按照下面的内容自行修改 src/pages/item-detail-page/item-detail-page.ts

    import { Component } from '@angular/core';
    import { NavParams } from 'ionic-angular';
    @Component({
      selector: 'page-item-detail-page',
      templateUrl: 'item-detail-page.html'
    })
    export class ItemDetailPage { 
      title;
      description; 
      constructor(public navParams: NavParams){ 
      } 
      ionViewDidLoad() {
        this.title = this.navParams.get('item').title;
        this.description = this.navParams.get('item').description;
      } 
    }
    

    当我们把这个页面将传入的数据项,点击,然后我们把物品的标题和描述,使用NavParams。

    现在我们要做的是在home.ts 内设置 viewItem 函数和导入新的细节页面。

    src/pages/home/home.ts 修改如下:

    viewItem(item){
      this.navCtrl.push(ItemDetailPage, {
        item: item
      });
    }
    

    添加的导入代码放在 src/pages/home/home.ts 的顶部:

    import { ItemDetailPage } from '../item-detail-page/item-detail-page';
    

    这时就可以push出项目的细节页面,然后传入被点击的项目。如果你现在点击存在于列表中的项目,你可能看到如下界面:

    3332945-04969bd0781d056a.png
    项目细节页面

    3 持久化数据保存

    Todo应用程序现在将基本工作,但数据没有被存储在任何地方只要你刷新应用程序你将失去你所有的数据(不理想)。

    现在我们要做的是创建一个服务被称为Data用来处理存储和检索数据。我们将使用Ionic 2提供的Stroage服务来帮助我们做到这一点。Stroage服务是Ionic 2的通用存储服务,它负责存储数据的最佳方式,同时提供了一致的API供我们使用。

    这意味着,如果您正在设备上运行,安装了SQLite插件,那么它将使用一个本地SQLite数据库进行存储,否则它将退回到使用基于浏览器的存储(可能被操作系统擦除)。

    运行下面代码创建服务

    ionic g provider Data
    

    data.ts 代码修改如下:

    import { Storage } from '@ionic/storage';
    import {Injectable} from '@angular/core'; 
    @Injectable()
    export class Data { 
      constructor(public storage: Storage){ 
      } 
      getData() {
        return this.storage.get('todos');  
      } 
      save(data){
        let newData = JSON.stringify(data);
        this.storage.set('todos', newData);
      } 
    }
    

    这个是有点不同于我们已经创建的组件(它可能更合适认为是service)。我们不使用@component装饰,而使用@Injectable声明这个类。

    在构造函数中,我们建立一个 Storage 服务的引用。

    数组中save函数简单地将所有的项放入数组并保存到存储,每当项目变化我们将调用这个函数。

    我们还将需要设置的Storage服务,以及 Data provider,在我们 app.module.ts 文件。

    src/app/app.module.ts 修改如下:

    import { NgModule } from '@angular/core';
    import { IonicApp, IonicModule } from 'ionic-angular';
    import { MyApp } from './app.component';
    import { HomePage } from '../pages/home/home';
    import { AddItemPage } from '../pages/add-item-page/add-item-page';
    import { ItemDetailPage } from '../pages/item-detail-page/item-detail-page';
    import { Storage } from '@ionic/storage';
    import { Data } from '../providers/data'; 
    @NgModule({
      declarations: [
        MyApp,
        HomePage,
        AddItemPage,
        ItemDetailPage
      ],
      imports: [
        IonicModule.forRoot(MyApp)
      ],
      bootstrap: [IonicApp],
      entryComponents: [
        MyApp,
        HomePage,
        AddItemPage,
        ItemDetailPage
      ],
      providers: [Storage, Data]
    })
    export class AppModule {}
    

    请注意,我们已经声明这些在providers的数组,而不是declarationsentryComponents数组。

    现在我们需要更新。ts使用这项新服务。

    src/pages/home/home.ts 文件修改如下:

    import { Component } from '@angular/core';
    import { ModalController, NavController } from 'ionic-angular';
    import { AddItemPage } from '../add-item-page/add-item-page'
    import { ItemDetailPage } from '../item-detail-page/item-detail-page';
    import { Data } from '../../providers/data'; 
    @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage { 
      public items = []; 
      constructor(public navCtrl: NavController, public modalCtrl: ModalController, public dataService: Data) { 
        this.dataService.getData().then((todos) => { 
          if(todos){
            this.items = JSON.parse(todos); 
          } 
        }); 
      } 
      ionViewDidLoad(){ 
      } 
      addItem(){ 
        let addModal = this.modalCtrl.create(AddItemPage); 
        addModal.onDidDismiss((item) => { 
              if(item){
                this.saveItem(item);
              } 
        }); 
        addModal.present(); 
      } 
      saveItem(item){
        this.items.push(item);
        this.dataService.save(this.items);
      } 
      viewItem(item){
        this.navCtrl.push(ItemDetailPage, {
          item: item
        });
      } 
    }
    

    这是我们最后的一些代码。再次,我们importing数据服务,通过传递给构造函数。我们依然设置 items 开始是空的,使用数据服务获取数据。
    重要的是要注意getData 返回promise而不是数据本身。抓取的数据存储是异步的,这意味着我们的应用程序将继续运行当数据加载时。promise让我们数据完成加载时执行一些操作,而不需要暂停整个应用程序。

    最后,我们还添加一个调用save 函数保存在数据服务当一个新的条目被添加。现在该函数将马上更新我们的新数据条目数组,但items也将被复制保存到数据服务,以便下次我们回到应用程序是可用。

    4 总结

    在本教程中我们已经介绍了如何实现很多Ionic 2应用的常用功能:

    • 创建视图
    • 监听和处理事件
    • 视图之间的导航
    • 在视图之间传递数据
    • 建立双向数据绑定
    • 保存数据

    显然还有很多我们可以做,使这个应用程序更漂亮,添加删除和编辑笔记的能力等等。

    展开全文
  • mean_stack_tutorial_todo_app 使用Angular4,Expressjs和MongoDB的Todo App 教程: :
  • TodoOrNotTodo:有关如何使用SquiDB框架在android上创建“ todo”应用程序的教程的源代码
  • mern_stack_tutorial_todo_app 使用React Redux,ExpressJs,MongoDb,ES6,React Bootstrap和Docker的Mern Stack Crud应用程序教程 教程: :
  • simple-todo最早是web.py一个中文教程的例子。后来Uliweb的作者limodou 认为这个教程很不错,于是有了Uliweb版的simple-todo。接着又有了Bottle版和Flask版。这俨然成了一个FrameworksShow项目。既然是...
  • 欢迎来到 Vue2.x Todo 系列教程,这个教程将手把手教你从零开始使用 Vue 搭建一个 Todo(待办事项)应用。 书写此教程的动机 Vue 作者尤雨溪在 新手向:Vue 2.0 的建议学习顺序 中给出了中肯的 Vue 学习建议,本系列...

    欢迎来到 Vue2.x Todo 系列教程,这个教程将手把手教你从零开始使用 Vue 搭建一个 Todo(待办事项)应用。

    书写此教程的动机

    Vue 作者尤雨溪在 新手向:Vue 2.0 的建议学习顺序 中给出了中肯的 Vue 学习建议,本系列教程和项目可以看做是这个建议的实践可操作版本。

    Vue 官方文档给出了 2 个示例项目,一个是 TodoMVC,令一个是 HackerNews 克隆。这两个项目一个用于入门,一个用于进阶。读懂这两个项目,几乎可以对 Vue 全部的核心特性:计算属性、侦听器、指令、动态样式绑定、条件渲染、列表渲染、事件处理、表单绑定、组件、组件间的通信、Vue 路由、服务端渲染、Vuex 等有一个全面的了解和掌握。遗憾是的,Vue 官方只有这两个项目的成品,而没有对应的开发教程。因此,本系列教程诞生的动机,就是剖析这两个项目,抽丝剥茧地带领 Vue 初学者们从 0 开始开发这两个项目,并在开发中不断学习巩固 Vue 的相关知识。

    Vue2.x Todo 系列教程 仅仅只是一个开端,依据尤雨溪的学习建议,我们会结合两个项目,完成下面的事情:

    1. 直接在 html 页面中编写 Vue,开发一个功能齐全的 Todo 应用,从中学习 Vue 的基础特性。
    2. 直接在 html 页面中编写 Vue,开发一个 HackerNews 应用,从中全面学习 Vue 的核心特性。
    3. 使用 Webpack 打包,开发一个 HackerNews 应用,了解前端工程化。

    配套教程会相继推出,帮助大家入门 Vue 开发,请关注我的个人博客 追梦人物的博客掘金主页

    教程特色

    • 完全面向新手,只需非常基础的 HTML、CSS 和 JavaScript 知识。
    • 抛却复杂的前端工程化配置过程,仅仅需要准备一个可以输入代码的文本编辑器和一个现代化的浏览器就可以运行 Vue 应用,聚焦 Vue 核心特性,而不是 webpack。
    • 完善的 GitHub 仓库,每一个开发步骤的代码都有一个对应分支,方便学习遇到问题时和示例项目的代码进行比较。
    • 关键开发步骤配有对应的开发练习,让你将所学的知识立即用于实践,练习配有完善的参考实现。
    • 持续的改进。

    项目演示

    我们的项目最终完成效果就是下面这个样子:

    你可以看到应用的界面处于上个世纪 80 年代的水平,因为我们使用了浏览器原生的 UI 而未加任何 CSS 样式。采用这种风格有很大的好处,这样我们可以将注意力完全集中在 Vue 的使用上,而不用关注那些多余的元素样式。毕竟连 Google、Amazon 和 Facebook 等很多知名公司的应用也采用这种极简化风格设计,而且小米创始人雷军也说过"没有设计的设计就是最好的设计",说明这种设计还是有可取之处的。

    当然采用一些如 Boostrap、Materialize 等框架后很容易为我们的 Vue Todo 应用加上样式,如果你做了一个风格不一样的 Todo,欢迎提一个 pull requests 给我。

    使用一个 Todo 应用来讲解 Vue 的核心特性是非常合适的,因为它麻雀虽小,但五脏俱全。一个 todo,几乎可以囊括 Vue 中计算属性、侦听器、指令、动态样式绑定、条件渲染、列表渲染、事件处理、表单绑定、组件、组件间的通信、自定义指令等核心特性。通过一个 todo 的例子来理解这些特性能帮助我们做什么事情,然后回过头去看相对枯燥的官方入门文档,一定会对 Vue 的这些特性有一个更加深刻的了解。

    相关资源

    教程目录索引

    教程

    教程中的练习参考答案

    开始学习吧!

    展开全文
  • 在上一篇有关Flutter中Sqflite的文章中,我们看到了如何使用Sqflite构建一个简单的todo应用程序。 从那时起,我收到了很多关于创建如何使用Sqflite构建列表视图的文章的要求。 因此,在本教程中,我将扩展相同的...
    flutter

    flutter

    在本教程中,我们将看一下如何在Flutter中使用Sqflite创建ListView。 在上一篇有关Flutter中Sqflite的文章中,我们看到了如何使用Sqflite构建一个简单的todo应用程序。

    从那时起,我收到了很多关于创建如何使用Sqflite构建列表视图的文章的要求。 因此,在本教程中,我将扩展相同的应用程序以使用sqflite数据库构建列表视图。

    如果您还没有阅读过上一篇文章,我强烈建议您这样做,因为我们将以该文章本身为基础:在Flutter中使用SQLite

    继续创建从以前的部分应用在这里

    我们将再添加一个屏幕以显示添加的项目列表。 可以通过顶部工具栏上的按钮进行访问。 AppBar中创建按钮,如下所示:

     appBar: AppBar(
    
      title: Text(widget.title),
    
      actions: <Widget>[
    
        IconButton(
    
          icon: Icon(Icons.favorite),
    
          onPressed: null ,
    
        )
    
      ],
     )
    

    为了添加新屏幕,首先创建一个名为favourite_screen.dart的文件,并在其中创建一个有状态的小部件:

     import 'package:flutter/material.dart' ;  FavouritesScreen class extends StatefulWidget {
    
      static const routeName = '/favourites' ; 
      @override
    
      _FavouritesScreenState createState() => _FavouritesScreenState();
     }
     _FavouritesScreenState class extends State<FavouritesScreen> {  }
    

    现在,设置导航本身是另一篇文章,但是我们将重点放在仅使用Sqflite创建ListView上。 因此,只需在main.dart的MaterialApp小部件内设置导航,如下所示

     MyApp class extends StatelessWidget {
    
      @override
    
      Widget build(BuildContext context) {
    
        return MaterialApp(
    
          title: 'Flutter Demo' ,
    
          theme: ThemeData(
    
            primarySwatch: Colors.blue,
    
            visualDensity: VisualDensity.adaptivePlatformDensity,
    
          ),
    
          home: MyHomePage(title: 'Listify' ),
    
          routes: {
    
            FavouritesScreen.routeName: (ctx) => FavouritesScreen(), // setting up routes
    
          },
    
        );
    
      }
     }
    

    现在,每当用户单击顶部的“收藏夹”按钮时,我们将导航至如下所示的屏幕:

     IconButton(
    
      icon: Icon(Icons.favorite),
    
      onPressed: () =>
    
          Navigator.of(context).pushNamed(FavouritesScreen.routeName),
     )
    

    现在是肉的部分。 我们必须从Sqflite数据库中获取数据并填充到列表视图中。 为了获取数据,我们将使用上一教程中的SqliteDatabaseHelper

    获取数据的最佳位置是initState方法内部。 这是应该在绘制屏幕之前进行设置的地方。 我们将数据存储在一个名为taskList的类属性中。

     _FavouritesScreenState class extends State<FavouritesScreen> {
    
      List<Todo> taskList = new List(); 
      @override
    
      void initState() {
    
        super .initState(); 
        DatabaseHelper.instance.queryAllRows().then((value) {
    
          setState(() {
    
            value.forEach((element) {
    
              taskList.add(Todo(id: element[ 'id' ], title: element[ "title" ]));
    
            });
    
          });
    
        }).catchError((error) {
    
          print(error);
    
        });
    
      }
     ...
    

    为了使用Sqflite创建ListView,我们将使用构建器模式。 这是我们的方法:

     @override
     Widget build(BuildContext context) {
    
      return Scaffold(
    
        appBar: AppBar(
    
          title: Text( "Favourites" ),
    
        ),
    
        body: Container(
    
          child: ListView.builder(itemBuilder: (ctx, index) {
    
            if (index == taskList.length) return null ;
    
            return ListTile(
    
              title: Text(taskList[index].title),
    
              leading: Text(taskList[index].id.toString()),
    
            );
    
          }),
    
        ),
    
      );
     }
    

    如果列表为空,您也可以选择显示其他内容,但是在这里,我们将坚持使用非空的大小写。

    让我们继续测试我们的应用程序:

    就是这样了。 在flift中创建一个sqview我们的列表视图真的很容易。 如果您仍然遇到任何问题,请在下面的评论部分中告诉我

    翻译自: https://www.javacodegeeks.com/2020/08/listview-using-sqflite-in-flutter-todo-application.html

    flutter

    展开全文
  • 还记得我们在第二篇教程中提到过的动作(actions)吗,今天我们就来专门讲讲在 Odoo 中的 action,学习不同类型的动作对应的应用场景,并且在我们的 Todo 应用中使用上其中一些类型的动作。 窗口动作 窗口动作在 ...
  • PhoneGap 教程:一个跨平台的 Todo App

    千次阅读 2014-12-03 17:38:20
    PhoneGap 是一个允许开发中使用s
  • Laravel拥有所有现代Web应用程序框架中最广泛,最全面的和视频教程库,因此轻而易举地开始使用该框架。 如果您不想读书,可以使用帮助。 Laracasts包含1500多个视频教程,涉及各种主题,包括Laravel,现代PHP,...
  • react和nodejsIn this tutorial, we will be using TypeScript on both sides (server and client) to build a Todo App from scratch with React, ... 在本教程中,我们将在双方(服务器和客户端)上使用TypeScrip...
  • 这里是ToDoList.exe安装使用教程 针对XP系统,需要将todolist.exe.XP.manifest重命名为todolist.exe.manifest Extra steps for Windows XP users 1. Rename the file 'todo...
  • Vue Todo 该项目基于。 请注意,尽管Shaun的教程都是关于Vue过渡的,但master分支并未实现动画。 该存储库还有一个专门用于实现过渡的分支。... Shaun的教程使用它来展示页面之间的过渡。 联系页面 这也是
  • 在前面教程中,我们使用了两种类型的视图——TreeView 和 FormView. 今天我们将学习使用另一种类型的视图——SearchView, 搜索视图。 搜索字段 通过之前的实践,我们应该已经知道 Odoo 会为我们的模型定义默认的 ...
  • 该项目是通过引导的。 并弹出了对.scss的支持,并在Webpack配置中添加了“ production”标志。 教程位于
  • 使用Spring Boot和MongoDB在后端以及Angular在前端构建完整的Todo应用程序。 要求 Java-1.8.x Maven-3.xx MongoDB-3.xx 设定步骤 1.克隆应用程序 git clone ...
  • 但是,由于互联网上普遍存在基本的Todo App教程,因此这项工作将比基本的Todo App进行得更多。 该应用程序必须使用原始Javascript。 没有框架或库。 (即React,Vue,Jquery) 我已经在./src为您启动了启动应用...
  • go-todo-rest-api-example, 简单todo应用程序的rest式API示例 执行 REST API 示例简单todo应用程序的rest式API示例这个简单的教程或者例子,使用 /mux ( 一个漂亮的mux库) 和英镑( 一个ORM的ORM ) 来制作简单的...
  • todoey_flutter 一个新的Flutter应用程序。 入门 该项目是Flutter应用程序的起点。...要获得Flutter入门方面的帮助,请查看我们的,其中提供了教程,示例,有关移动开发的指南以及完整的API参考。
  • 这是一个交互式教程,将教您如何使用Python和Pipenv使用Python Flask框架创建API。 请单击此处开始教程: 关于我们将要建设的项目 在本教程中,我们将构建一个REST API,该API将3个端点公开给互联网: GET /todos ...
  • Laravel拥有所有现代Web应用程序框架中最广泛,最全面的和视频教程库,因此轻而易举地开始使用该框架。 如果您不想读书,可以使用帮助。 Laracasts包含1500多个视频教程,涉及各种主题,包括Laravel,现代PHP,...
  • lebus教程04 p67-75:本地储存coredata 和 realm 介绍cs/bs架构 cs不需要大量的网络连接,提高软件的使用体验。 本地存储三种方法: userdefaults core data – apple 自带的,代码较多,速度不够快–不推荐 realm-...
  • lebus教程03 p58-66:Todos app p58 新建一个todos项目 将项目添加 tableViewController,并且设置为起始页面,添加对应的类 将项目分割成mvc模式,查看tabelviewController的方法 p58: cell指定一个类,通过方法...
  • 上一篇:使用 Node.js 实现一个命令行 todo-list(1)- 基本功能上一篇文章实现了工具的基本功能,这篇文章来试着为工具添加单元测试。选择测试框架这里选择 Jest,根据官网教程安装并修改 package.json:{ ... ...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 273
精华内容 109
关键字:

todo使用教程