将jQuery转换为Angular并优化性能(Convert jQuery to Angular and optimize performance)
我找到了漂亮的“控制台之类”窗口 - http://demos.telerik.com/kendo-ui/autocomplete/events (开始输入框),我正在尝试创建Angular版本。
我的代码如下所示:
angular.module('myApp', []) .directive('console', ['$rootScope', function($rootScope) { return { restrict: 'E', template: [ '<div class="console animated">', '<div ng-repeat="event in events" ng-class="{\'error\': event.type == \'error\', \'log\': event.type == \'log\'}">{{event.data}}</div>', '</div>' ].join(''), link: function($scope, element) { $scope.events = []; $rootScope.$on('Log', function(event, data) { //console.log(event, data); $scope.events.splice(0, 0,{ type: 'log', data: "Log :: "+data }); }); $rootScope.$on('Error', function(event, data) { //console.log(event, data); $scope.events.splice(0, 0,{ type: 'error', data: "Error :: "+data }); }); } };
我可以通过调用以下方法将项添加到我的控制台:
$rootScope.$emit("Error", "Something bad happened");
这是我目前的版本: https : //plnkr.co/edit/iLZKa8hPCBSRDV0dhn15?p = preview
最重要的是原始的jQuery版本,在Angular版本的底部。
我缺少的是事件聚合:
原始版本是灌浆条目和添加计数器是同一事件发生一次更多。
如何将其添加到我的代码中(Angular方式)?
除了转换,我还有两个问题我想问:
- 这是我写的第一个指令之一,如果我犯了任何错误,请告诉我。
- 这个“控制台”将显示许多事件,我想知道如何优化它 - 我应该只显示最近20个条目,还是可以添加虚拟滚动等功能来优化它?I found nice looking "console like" window - http://demos.telerik.com/kendo-ui/autocomplete/events (start typing in box) and I'm trying to create Angular version.
My code looks like this:
angular.module('myApp', []) .directive('console', ['$rootScope', function($rootScope) { return { restrict: 'E', template: [ '<div class="console animated">', '<div ng-repeat="event in events" ng-class="{\'error\': event.type == \'error\', \'log\': event.type == \'log\'}">{{event.data}}</div>', '</div>' ].join(''), link: function($scope, element) { $scope.events = []; $rootScope.$on('Log', function(event, data) { //console.log(event, data); $scope.events.splice(0, 0,{ type: 'log', data: "Log :: "+data }); }); $rootScope.$on('Error', function(event, data) { //console.log(event, data); $scope.events.splice(0, 0,{ type: 'error', data: "Error :: "+data }); }); } };
And I can add item to my console by calling:
$rootScope.$emit("Error", "Something bad happened");
Here is my current version: https://plnkr.co/edit/iLZKa8hPCBSRDV0dhn15?p=preview
On top is original jQuery version, on bottom in Angular version.
The thing I'm missing is event aggregation:
Original version is groupping entries and adding counter is same event occures more that once.
How can I add this to my code (Angular way)?
Besides conversion I have two more questions I'd like to ask:
-This in one of my first directives I'm writing, if I'm making any mistakes in it please let me know.
-This "console" will show many events and I'd like to know how to optimize it - should I show for example only last 20 entries or can I add functionality like virtual scroll to optimize it a bit?
原文:https://stackoverflow.com/questions/36054240
最满意答案
在您的
CriminalProvider
构造函数中,您将未初始化的crimeList(null
)提供给超类ArrayAdapter
构造函数。 您只是在将空引用传递给超级构造函数后初始化列表。移动
criminalList = new ArrayList<Criminal>()
到成员变量初始化部分:
private static List<Criminal> criminalList = new ArrayList<Criminal>();
static
是一个代码味道,但如果你坚持使用它,你可以检查列表的size()
,看看你是否需要在适配器构造函数中填充它。In your
CriminalProvider
constructor you're supplying uninitializedcriminalList
(null
) to the superclassArrayAdapter
constructor. You're only initializing the list after passing the null reference to the super constructor.Move the
criminalList = new ArrayList<Criminal>()
to the member variable initialization part:
private static List<Criminal> criminalList = new ArrayList<Criminal>();
static
is a code smell here but if you insist on using it, you can e.g. check for the list'ssize()
to see whether you need to populate it in the adapter constructor.
相关问答
更多-
int y = listView.getChildAt(0).getHeight(); 我知道这是因为ListView还没有渲染,所以它没有孩子,当我从onCreate()或onResume()调用这个。 你应该在onScroll调用它。 listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollS ...
-
在您的CriminalProvider构造函数中,您将未初始化的crimeList( null )提供给超类ArrayAdapter构造函数。 您只是在将空引用传递给超级构造函数后初始化列表。 移动 criminalList = new ArrayList
() 到成员变量初始化部分: private static List criminalList = new ArrayList (); static是一个代码味道,但如果你坚持使用它,你可以检查 ... -
Android应用程序空指针无法启动活动ComponentInfo(Android Application Null Pointer Unable to start Activity ComponentInfo)[2022-06-03]
代替 if(currentUser.getString("university").equals("")) 使用 if(currentUser==null || currentUser.getString("university")==null || currentUser.getString("university").equals("")) Instead of if(currentUser.getString("university").equals("")) Use if(currentUse ... -
NullPointer异常错误在Android / SQLITE应用程序上(NullPointer Exception error On Android/SQLITE aplication)[2022-09-25]
你永远不会调用myDataBase方法,所以myDataBase对象在执行到达行时为null .- Cursor query = myDataBase.rawQuery("SELECT Arquivo FROM Comercial ORDER BY UltimaExecucao ASC , Random DESC LIMIT 1 ", null); 抛出NullPointerException 。 You're never calling openDataBase method, so myDataBas ... -
错误在此功能中 public String getTimeZone() { return mTimeZone; } 返回null的mTimeZone变量,以下代码提升异常: TimeZone.getTimeZone(getTimeZone()) 另外,在这个功能中: private CurrentWeather getCurrentDetails(String jsonData) throws JSONException { JSONObject forecast = new JSONO ...
-
将Facebook登录与Android应用程序集成时,空指针异常(Null pointer exception while integrating Facebook login with android app)[2023-04-18]
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT]; 片段数组的长度为2; 所以当你打电话 private void showFragment(int fragmentIndex, boolean addToBackStack) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.b ... -
这一行在这里 btnSongList.setOnClickListener(new OnClickListener(){@Override public void onClick(View v) {visible();}}); 您从未为此特定视图调用findViewById() ,因此指针仍为null。 This line here btnSongList.setOnClickListener(new OnClickListener(){@Override public void on ...
-
可能R.id.tvEvent和其他视图属于R.layout.item ,因此,您应该使用item来检索其中的对象。 例如 View item = inflater.inflate(R.layout.item, linearLayout, false); TextView tvEvent = (TextView)item.findViewById(R.id.tvEvent); Probably R.id.tvEvent and the other views belong to R.layo ...
-
Internet连接导致Android应用程序中出现空指针异常(Internet connectivity causes Null Pointer Exception in Android application)[2024-03-08]
使用以下代码更改您的方法。 public static boolean isConnected(Context context){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return a ... -
我不知道infos在哪里被初始化,但是基于异常( java.lang.ArrayIndexOutOfBoundsException: length=6; index=6 ),它的长度为6,因此infos[6]超出了数组范围。 I don't know where infos is initialized, but based on the exception (java.lang.ArrayIndexOutOfBoundsException: length=6; index=6), it has a len ...