SAP UI5和Angular里控制器(Controller)实现逻辑比较

Let’s first refresh our memory on SAPUI5 controller. I have a simple xml view which only contains a button:



And a simple controller:

sap.ui.define(["sap/ui/core/mvc/Controller"], function(Controller){
"use strict";
return Controller.extend("buttontutorial.view.simple",{
onInit : function() {
  debugger;
}
  });}
);

due to the attribute controllerName=”buttontutorial.view.simple” in XML view, the controller instance is created and connect with XML view instance by UI5 framework:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第1张图片

And we can use JavaScript code in console to list the larget number of attributes belonging to created controller instance:


for( var name in this ) { console.log("attribute: " + name + " value: " + this[name]);}

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第2张图片

Or you can simply type “this.” in console, and see there are lots of methods available for controller instance:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第3张图片

For example, byId method of controller instance is widely used, if you type this.byId in console, you can see its implementation just delegates the call to this.oView.byId.

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第4张图片

This makes sense since every controller instance holds a reference to its host view via oView, and the connection between controller and its view is established in function connectToView:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第5张图片

Angular Controller

You can play with the sample Angular application from this url.

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第6张图片

It consists of 31 lines of source code:


  
    
    Angular.js Example
    
    
  
  
    
  • {{name}}

When you type a new language in input field and click “Add” button, the language will be added into list above:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第7张图片

Let me first briefly introduce the idea of source code, then I will go through with each point in detail.

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第8张图片

(1) controller instance initialization

During Angular bootstrap phase, due to this line of source code in html, , Angular will create a new controller instance in line 5327. You can consider $controller as a factory function.

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第9张图片

Let’s have a look at the content of argument locals for factory function:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第10张图片

The most important attribute is $scope, which is passed into function NameCtrl defined by us:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第11张图片

Once our application code is executed, controller instance is created. However, after checking it in Chrome, I found it is just a dummy instance without any important attribute. Instead, the data model and addName function are appended and available in current scope:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第12张图片

(2) How addFunction available in scope object will be called when add button is called

Based on study result in step1, the addName function is located in scope object. My question is, when I press add button, why is it called?

In previous blog Compare Event handling mechanism: SAPUI5 and Angular, I already introduced that Angular does event handler registration automatically for us, as long as it detects the directive like this:

.

Actually I have made modifications on angular.js, adding more trace so that you can easily find where Angular achieves event registration under the hood:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第13张图片

So it is called as expected:

SAP UI5和Angular里控制器(Controller)实现逻辑比较_第14张图片

Summary

UI5 controller instance has a large number of useful functions available to use, and for Angular, controller instance is just a dummy one: data model and event handler function are located in scope object instead.

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

你可能感兴趣的:(ui,angular,container,sap,saprfc)