1. 程式人生 > >Ember.js 入門指南——控制器(controller)

Ember.js 入門指南——控制器(controller)

ember new chapter5_controllers
cd chapter5_controllers
ember server

從本篇開始進入第五章控制器,controllerEmber2.0開始越來越精簡了,職責也更加單一——處理邏輯。

下面是準備工作。

從新建立一個Ember專案,仍舊使用的是Ember CLI命令建立。

在瀏覽器執行專案,看到如下資訊說明專案搭建成功。

Welcome to Ember

1,控制器簡介

       控制器與元件非常相似,由此,在未來的新版本中很有可能元件將會完全取代控制器,很可能隨著Ember版本的更新控制器將退出Ember。目前的版本中元件還不能直接通過路由訪問,需要通過模板呼叫才能使用元件,但是未來的版本會解決這個問題,到時候

controller可能就真的從Ember退出了!

       正因如此,模組化的Ember應用很少用到controller。即便是使用了controller也是為了處理下面的兩件事情:

  1. controller主要是為了維持當前路由狀態。一般來說,model的屬性會儲存到伺服器,但是controller的屬性卻不會儲存到伺服器。

  2. 元件上的動作需要通過controller層轉到route層。

模板上下文的渲染是通過當前controller的路由處理的。Ember所追隨的理念是約定優於配置,這也就意味著如果你只需要一個controller 你就建立一個,而不是一切為了便於工作

下面的例子是演示路由顯示

blog post。假設模板blog-post用於展示模型blog-post的資料,並在這個模型包含如下屬性(隱含屬性id,因為在model中不需要手動指定id屬性):

  • title 

  • intro

  • body

  • author

model定義如下:

//  app/models/blog-post.js
 
import DS from 'ember-data';
 
export default DS.Model.extend({
  title: DS.attr('string'),  //  屬性預設為string型別,可以不指定
  intro: DS.attr('string'),
  body: DS.attr('string'),
  author: DS.attr('string')
});

route層增加測試資料,直接返回一個model物件。

//  app/routes/blog-post.js
 
import Ember from 'ember';
 
export default Ember.Route.extend({
       model: function() {
              var blogPost = this.store.createRecord('blog-post', {
                     title: 'DEFINING A COMPONENT',  //  屬性預設為string型別,可以不指定
                     intro: "Components must have at least one dash in their name. ",
                     body: "Components must have at least one dash in their name. So blog-post is an acceptable name, and so is audio-player-controls, but post is not. This prevents clashes with current or future HTML element names, aligns Ember components with the W3C Custom Elements spec, and ensures Ember detects the components automatically.",
                     author: 'ubuntuvim'
              });
              // 直接返回一個model,或者你可以返回promises,
              return blogPost;
       }
});

顯示資訊的模板如下:

<!--  app/templates/blog-post.hbs  -->
 
<h1>{{model.title}}</h1>
<h2>{{model.author}}</h2>
 
<div>
       {{model.intro}}
</div>
 
<hr>
 
<div>
       {{model.body}}
</div>

如果你的程式碼沒有編寫錯誤那麼也會得到如下結果:

“Welcome to Ember”是主模板的資訊,你可以在application.hbs中刪除,但是記得不要刪除{{outlet}},否則什麼資訊也不顯示。

       這個例子中沒有顯示任何特定的屬性或者指定的動作(action)。此時,控制器的model屬性所扮演的角色僅僅是模型屬性的“pass-through”(或代理)。

注意:控制器獲取的model是從route得到的。

下面為這個例子增加一個功能:使用者可以點選標題觸發顯示或者隱藏post的內容。通過一個屬性isExpanded控制,下面分別修改模板和控制器的程式碼。

//  app/controllers/blog-post.js
 
import Ember from 'ember';
 
export default Ember.Controller.extend({
       isExpanded: false,  //預設不顯示body
       actions: {
              toggleBody: function() {
                     this.toggleProperty('isExpanded');
              }
       }
});

       controller中增加一個屬性isExpanded,如果你不在controller中定義這個屬性也是可以的。對於這個controller程式碼的解釋請看《Ember.js 指南——{{action}} 助手》。

<!--  app/templates/blog-post.hbs  -->
 
<h1>{{model.title}}</h1>
<h2>{{model.author}}</h2>
 
<div>
       {{model.intro}}
</div>
 
<hr>
{{#if isExpanded}}
       <button {{action 'toggleBody'}}>hide body</button>
       <div>
              {{model.body}}
       </div>
{{else}}
       <button {{action 'toggleBody'}}>Show body</button>
{{/if}}

在模板中使用if助手判斷isExpanded的值,如果為true則顯示body,否則不顯示。

頁面載入之後結果如下,首先是不顯示body內容,點選按鈕“Show body”則顯示內容,並且按鈕變為“hide body”。然後在點選這個按鈕則不顯示body內容。

       到此controller的職責你應該大致瞭解了,其主要的作用是邏輯的判斷、處理,比如這裡例子中判斷body內容的顯示與否,其實你也可以把controller類中的處理程式碼放在route類中也可以實現這個效果,但是要作為model的屬性返回(把isExpanded當做model的屬性處理),請讀者自己動手試試,但是把邏輯放到route又會使得route變得不專一了,route的主要職責是初始化資料的。我想這也是Ember還留著controller的原因之一吧!!

相關推薦

Ember.js 入門指南——控制器controller

ember new chapter5_controllers cd chapter5_controllers ember server 從本篇開始進入第五章控制器,controller在Ember2.0開始越來越精簡了,職責也更加單一——處理邏輯。 下面是準備工作。

Ember.js 入門指南

@(Ember)[MVVM|前端框架|HTML桌面應用] 序言 經常有人質疑,在前端搞MV*有什麼意義?也有人跟我提出這樣的疑問:以AngularJS,Knockout,BackBone為代表的MV*框架,它跟jQuery有什麼區別?我jQuery用

Ember.js 入門指南——繫結bingding

    ​正如其他的框架一樣Ember也包含了多種方式繫結實現,並且可以在任何一個物件上使用繫結。也就是說,繫結大多數情況都是使用在Ember框架本身,對於開發最好還是使用計算屬性。 1,雙向繫結 // 雙向繫結 Wife = Ember.Object.extend(

Spring MVC-控制器Controller-多動作控制器Multi Action Controller示例轉載實踐

cli move tps tree ssa targe ima and patch 以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_multiactioncontroller.htm 說明:示例基於Sp

Spring MVC-控制器Controller-參數方法名稱解析器Parameter Method Name Resolver 示例轉載實踐

title rop port img lsp java類 轉載 mvc export 以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_parametermethodnameresolver.htm 說明

Docker官方入門指南容器

給你的環境一個快速的測試執行,以確保你所有的設定: docker run hello-world 介紹 現在是開始構建Docker方式的應用程式的時候了。我們將從這個應用程式的層次結構的底部開始,這個應用程式是一個容器,我們在這個頁面上覆蓋。在這個層次上面

Ember.js 入門指南——處理事件

ber.js 入門指南——處理事件        你可以在元件中響應事件,比如使用者的雙擊、滑鼠滑過、鍵盤的按下等等事件。只需要在元件類中增加Ember提供的處理事件,然後Ember會自動判斷使用者的操作執行相應的事件,只要在元件類中新增的事件不衝突你甚至一次性增加多個

Ember.js 入門指南——非同步路由

本文將為你介紹路由的高階特性,這些高階特性可以用於處理專案複雜的非同步邏輯。 關於單詞promises,直譯是承諾,但是個人覺得還是使用原文吧。讀起來順暢點。 1,promises(承諾)        Ember的路由處理非同步邏輯的方式是使用promises。簡

Ember.js 入門指南——元件定義

    不得不說,Ember的更新是在是太快了!!本教程還沒寫到一半就又更新到v2.1.0了!!!!不過為了統一還是使用官方v2.0.0的參考文件!!        從本篇開始進入新的一章——元件。這一章將用6篇文章介紹Ember的元件,從它的定義開始知道它的使用方式,

Ember.js 入門指南——路由定義

    當你的應用啟動的時候,路由器就會匹配當前的URL到你定義的路由上。然後按照定義的路由層次逐個載入資料、設定應用程式狀態、渲染路由對應的模板。 1,基本路由         在app/router.js的map方法裡定義的路由會對映到當前的URL。當map方法被

javafx 之獲取fxml的控制器controller

像對話方塊一樣的彈出一個fxml介面的時候,往往需要獲取它的控制器,以便執行一些初始化的操作,獲取fxml控制器的程式碼如下        URL location = getClass().getResource("/Frame2XML/Frame2.fxml");   

Ember.js 入門指南——新建、更新、刪除記錄

前一篇介紹了查詢方法,本篇介紹新建、更新、刪除記錄的方法。 本篇的示例程式碼建立在上一篇的基礎上。對於整合firebase、建立route和template請參看上一篇,增加一個controller:ember g controller articles。 1,新建

Ember.js 入門指南——{{action}} 助手

action助手所現實的功能與javascript裡的事件是相似的,都是通過使用者點選元素觸發定義在元素上的事件。Ember的action助手還允許你傳遞引數到對應的controller、component類,在controller或者component上處理事件的邏輯。

Ember.js 入門指南——工具類的助手

    本篇主要介紹格式轉換、自定義helper、自定義helper引數、狀態helper、HTML標籤轉義這幾個方面的東西。 按照文章慣例先準備好測試所需要的資料、檔案。仍然是使用Ember CLI命令,這次我們建立的是helper、controller、route

Ember.js 入門指南——路由切換的防止和重試

    在路由的切換過程中,Ember路由器會通過回撥(beforeModel、model、afterModel、redirect)解析一個transition物件到切換的下一路由中。任何一個回撥都可以通過傳遞過來的transition引數獲取transition物件,然

Ember.js 入門指南——表單元素

Ember提供的表單元素都是經過封裝的,封裝成了view元件。經過解析渲染之後就會生成普通的HTML標籤。更多詳細資訊你可以檢視他們的實現原始碼:Ember.TextField、Ember.Chechbox、Ember.TextArea。        按照慣例,先建

Ember.js 入門指南——{{link-to}} 助手

1,link-to助手常規使用 link-to助手錶達式渲染之後就是一個a標籤。而a標籤的href屬性的值是根據路由生成的,與路由的設定是息息相關的。並且每個設定的路由名稱都是有著對應的關係的。 為了演示效果,用命令生成了一個route(或者手動建立檔案)並獲取測試資

張高興的 .NET Core IoT 入門指南使用 I2C 進行通訊

什麼是 I2C 匯流排 I2C 匯流排(Inter-Integrated Circuit Bus)是裝置與裝置間通訊方式的一種。它是一種序列通訊匯流排,由飛利浦公司在1980年代為了讓主機板、嵌入式系統或手機用以連線低速周邊裝置而發展[1]。I2C 匯流排包含兩根訊號線,一根為訊號線 SDA ,另一根為時鐘

張高興的 .NET Core IoT 入門指南使用 SPI 進行通訊

什麼是 SPI 和上一篇文章的 I2C 匯流排一樣,SPI(Serial Peripheral Interface,序列外設介面)也是裝置與裝置間通訊方式的一種。SPI 是一種全雙工(資料可以兩個方向同時傳輸)的序列通訊匯流排,由摩托羅拉於上個世紀 80 年代開發[1],用於短距離裝置之間的通訊。SPI 包

ASP.NET Core MVC 之控制器Controller

  操作(action)和操作結果(action result)是 ASP.NET MVC 構建應用程式的一個基礎部分。   在 ASP.NET MVC 中,控制器用於定義和聚合一組操作。操作是控制器中處理傳入請求的一種方法。控制器提供了一種邏輯方式,將相似的操作組織起來,允許一些通用的規則(例如路