GVKun编程网logo

javascript – AngularJS将ui-view嵌套到ng-repeat中(angular 嵌入html)

1

在本文中,您将会了解到关于javascript–AngularJS将ui-view嵌套到ng-repeat中的新资讯,同时我们还将为您解释angular嵌入html的相关在本文中,我们将带你探索jav

在本文中,您将会了解到关于javascript – AngularJS将ui-view嵌套到ng-repeat中的新资讯,同时我们还将为您解释angular 嵌入html的相关在本文中,我们将带你探索javascript – AngularJS将ui-view嵌套到ng-repeat中的奥秘,分析angular 嵌入html的特点,并给出一些关于Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用、angularjs – angular-infinite $digest循环在ng-repeat中、Angularjs使用ng-repeat中$even和$odd属性的注意事项、AngularJS实践之使用ng-repeat中$index的注意点的实用技巧。

本文目录一览:

javascript – AngularJS将ui-view嵌套到ng-repeat中(angular 嵌入html)

javascript – AngularJS将ui-view嵌套到ng-repeat中(angular 嵌入html)

我正在使用Spotify API创建一个应用程序.
这个程序可以:
1.通过输入字段按艺术家姓名查找专辑
2.一旦显示专辑,用户可以点击专辑的标题并查看其曲目

我创建了2个视图:
1.专辑视图
2.曲目视图,专辑视图的子项.

我想将特定点击专辑的曲目ui-view(带有ID)显示在专辑的ng-repeat中,但结果是我在所有专辑列表中都有相同的专辑曲目列表.如何将专辑的曲目ui-view显示在由ng-repeat指令导致的单击相册容器中?

这是代码.

路由:

------
.config(function ($stateProvider,$urlRouterProvider) {
    $urlRouterProvider.otherwise('/');

    $stateProvider
      .state('albums',{
        url: '/',templateUrl: 'views/main.html',controller: 'MainCtrl'
      }).
      state('albums.tracks',{
        url: ':id/tracks',templateUrl: 'views/tracks.html',controller: 'TracksCtrl'
      });
})
-----

相册视图:

<div ng-if="albums.items">
    <h1>{{searchedArtist}}'s Album List:</h1>
    <!-- albums ng-repeat -->
    <div ng-repeat="album in albums.items | unique:'name'" id="{{album.id}}">
    <img  ng-src="{{album.images[1].url}}" width="100">
    <!-- the action to translate the state to tracks view -->
    <a ui-sref="albums.tracks({id : album.id})">{{album.name}}</a>
    <!-- tracks view -->
    <div ui-view></div>
</div>

主要专辑控制器:

angular.module('spotifyAngularapp')
.controller('MainCtrl',function ($scope,spotifyService) {

  var options = {
    'limit': 10
  };

  $scope.searchAlbums= function () {
    var sanitizeArtist = $scope.artist.split(' ').join('+');
    $scope.searchedArtist = $scope.artist;

    spotifyService.search(sanitizeArtist,'album',options).then(function(data) {
        $scope.albums = data.albums;
    });
  };
});

轨道控制器:

angular.module('spotifyAngularapp')
.controller('TracksCtrl',$stateParams,spotifyService) {
    console.log($stateParams);
    spotifyService.albumTracks($stateParams.id).then(function(data){
        $scope.tracks = data.items;
      });
});

解决方法

你想要做的事情没有意义.状态可能有多个与之关联的视图,但这些视图必须是预定义的,而不是动态生成的.

您静态定义唯一1个视图的代码之间存在冲突:

state('albums.tracks',controller: 'TracksCtrl'
      });

以及使用ng-repeat动态生成ui-view的代码.没有逻辑可以说明加载你的html的ui-view.在这种情况下,我建议通过将其移出ng-repeat只有1个ui-view:

<div ng-if="albums.items">
    <h1>{{searchedArtist}}'s Album List:</h1>
    <!-- albums ng-repeat -->
    <div ng-repeat="album in albums.items | unique:'name'" id="{{album.id}}">
        <img  ng-src="{{album.images[1].url}}" width="100">
        <!-- the action to translate the state to tracks view -->
        <a ui-sref="albums.tracks({id : album.id})">{{album.name}}</a>
    </div
    <!-- tracks view -->
    <div ui-view></div>
</div>

或者,如果由于布局页面的方式确实需要将其置于ng-repeat内,请尝试ng-if以确保仅显示1 ui-view. (这是一种解决方法,不推荐)

<div ng-if="albums.items">
        <h1>{{searchedArtist}}'s Album List:</h1>
        <!-- albums ng-repeat -->
        <div ng-repeat="album in albums.items | unique:'name'" id="{{album.id}}">
            <img  ng-src="{{album.images[1].url}}" width="100">
            <!-- the action to translate the state to tracks view -->
            <a ui-sref="albums.tracks({id : album.id})">{{album.name}}</a>
            <!-- tracks view -->
            <div ng-if="$state.is('albums.tracks',{id : album.id})" ui-view></div>
        </div>
</div>

并修改你的MainCtrl一点注入$state,以便我们在视图中访问它:

angular.module('spotifyAngularapp')
.controller('MainCtrl',spotifyService,$state) {
  $scope.$state = $state;

  //your code
});

Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用

Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用

在 Android 的开发过程中、遇到一个新需求、那就是让 Java 代码和 Javascript 代码进行交互、在 IOS 中实现起来很麻烦、而在 Android 中相对来说容易多了、Android 对这种交互进行了很好的封装、我们可以很简单的用 Java 代码调用 WebView 中的 js 函数、也可以用 WebView 中的 js 来调用 Android 应用中的 Java 代码。

案例主要包含了:

  1.  Html 中调用 Android 方法
  2. Android 调用 JS 方法无参数
  3. Android 调用 JS 方法有参数
  4. Android 调用 JS 方法有参数且有返回值处理方式 1
  5. Android 调用 JS 方法有参数且有返回值处理方式 2(Android4.4 以上)

1:创建 JS 对象

webView.addJavascriptInterface(new JsInterface(), "obj");
public class JsInterface {
	//JS中调用Android中的方法 和返回值处理的一种方法
		
	/****
          * Html中的点击事件 onclick
	  *  <input type="button" value="结算" onclick="showToast(''12'')">
	  * @param toast
	  */
	@JavascriptInterface
	public void showToast(String toast) {
	  Toast.makeText(MainActivity.this, "你的商品价格是:¥"+toast, Toast.LENGTH_SHORT).show();
	}
}
 function showToast(toast) { 
	var money=toast*3;
	javascript:obj.showToast(money);
}

2:

webView.loadUrl("javascript:funFromjs()");
function funFromjs(){
    document.getElementById("helloweb").innerHTML="div显示数据,无参数";
}

3:

webView.loadUrl("javascript:funJs(''Android端传入的信息,div标签中显示,含参数'')");
function funJs(msg){
   document.getElementById("hello2").innerHTML=msg;
}

4: 

webView.loadUrl("javascript:sum(6,6)");
/***
 * Android代码调用获取J是中的返回值
 * 
 * @param result
*/
   @JavascriptInterface
   public void onSum(int result) { 
	Toast.makeText(MainActivity.this, "Android调用JS方法且有返回值+计算结果=="+result, Toast.LENGTH_SHORT).show();
   } 
function sum(i,m){ 
    var result = i*m; 
    document.getElementById("h").innerHTML= "Android调用JS方法且有返回值--计算结果="+result; 
    javascript:obj.onSum(result) 
} 

5:

 webView.evaluateJavascript("sumn(6,11)", new ValueCallback<String>() {
         @Override
	 public void onReceiveValue(String value) {
	     Toast.makeText(MainActivity.this, "返回值"+value, Toast.LENGTH_SHORT).show();
           }
});
function sumn(i,m){ 
     var result = i*m; 
     document.getElementById("hh").innerHTML= "Android调用JS方法且有返回值--计算结果="+result; 
     return result;
} 

   注意:

1、Java 调用 js 里面的函数、效率并不是很高、估计要 200ms 左右吧、做交互性很强的事情、这种速度很难让人接受、而 js 去调 Java 的方法、速度很快、50ms 左右、所以尽量用 js 调用 Java 方法

2、Java 调用 js 的函数、没有返回值、调用了就控制不到了

3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString () 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间

4、网页中尽量不要使用 jQuery、执行起来需要 5-6 秒、最好使用原生的 js 写业务脚本、以提升加载速度、改善用户体验。

注:使用的是本地的 Html 文件,不过在网络链接的 Html 文件也是可以实现的。   

源码点击下载

angularjs – angular-infinite $digest循环在ng-repeat中

angularjs – angular-infinite $digest循环在ng-repeat中

我想在ng-repeat属性中调用函数,这是我的代码

example plnkr

HTML

<body ng-controller="mainCtrl">
  <div ng-repeat='item in getGroupedRange() track by item.id'>
    <span>{{item.val}}</span>
    <span>{{item.abs}}</span>
    <span>{{item.rel}}</span>
    <span>{{item.cum}}</span>
  </div>
</body>

JS

$scope.getGroupedRange = function() {
    return [
      {
        val: 1,abs: 1,rel: 1,cum: 1,id: 123456
      }
    ];
  };

当我打开控制台时,我注意到了错误

10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [[{"msg":"fn: function (c,d,e,f){e=a(c,f);return b(e,c,d)}","newVal":9,"oldVal":8}],[{"msg":"fn: function (c,"newVal":10,"oldVal":9}],"newVal":11,"oldVal":10}],"newVal":12,"oldVal":11}],"newVal":13,"oldVal":12}]]

我的代码的主要目标是使用ng-repeat中的函数来计算每个事件循环中的数据

不,你不能像这样在ngRepeat中使用函数.问题是Angular在摘要循环中使用严格的对象比较来确定自上次检查后属性的值是否发生了变化.那么,每次调用getGroupedRange都会返回新值(新数组). Angular不知道并认为这个值不稳定,因此继续检查.但它在10次检查后中止.

您需要构造必要的数组并将其分配给scope属性,因此在摘要循环期间不会更改:

$scope.groupedRange = $scope.getGroupedRange();

然后像在ngRepeat中一样使用它

<div ng-repeat='item in groupedRange track by item.id'>
    <span>{{item.val}}</span>
    <span>{{item.abs}}</span>
    <span>{{item.rel}}</span>
    <span>{{item.cum}}</span>
  </div>

Angularjs使用ng-repeat中$even和$odd属性的注意事项

Angularjs使用ng-repeat中$even和$odd属性的注意事项

前言

JavaScript中数组的索引是从0开始的,因此我们再取奇偶的时候需要用!$even和!$odd来将$even和$odd的布尔值反转

下面给出一个实例:

使用$odd和$even来制作一个红蓝相间的列表

rush:xhtml;"> <Meta charset="utf-8"> ng-repeat的<a href="https://www.jb51.cc/tag/yongfa/" target="_blank">用法</a> .odd { background-color: blue; } .even { background-color: red; }

ng-repeat用来遍历一个集合或为集合中的每个元素生成一个模板实例。集合中的每个元素 都会被赋予自己的模板和作用域。同时每个模板实例的作用域中都会暴露一些特殊的属性。

  • $index:遍历的进度(0...length-1)。
  • $first:当元素是遍历的第一个时值为true。
  • $middle:当元素处于第一个和后元素之间时值为true。
  • $last:当元素是遍历的后一个时值为true。
  • $even:当$index值是偶数时值为true。
  • $odd:当$index值是奇数时值为true。
下面的例子展示了如何用$odd和$even来制作一个红蓝相间的列表。记住,JavaScript中数组 的索引从0开始,因此我们用!$even和!$odd来将$even和$odd的布尔值反转。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

AngularJS实践之使用ng-repeat中$index的注意点

AngularJS实践之使用ng-repeat中$index的注意点

发现问题

最近有客户投诉,说在删除指定的某条记录时,结果删掉的却是另外一条记录!看起来是个很严重的BUG。 有一次我们在工作中碰到了这个问题。 要定位这个BUG非常麻烦,因为客户也不清楚如何重现这个问题。

后来发现这个Bug是由于在 ng-repeat 中使用了 $index 引发的。

一个简单动作(action)的列表

先来看看一个完整有效的ng-repeat示例。

rush:xhtml;">

对应的控制器(controller)如下:

rush:js;"> app.controller('ListCtrl',['$scope',function($scope) { //items come from somewhere,from where doesn't matter for this example $scope.items = getItems();

$scope.remove = function(index) {
var item = $scope.items[index];
removeItem(item);
};
}]);

看起来没什么问题,对吗? 这段代码也没有任何特别值得注意的。

添加一个过滤器(filter)

然后,让我们来做一个小小的修改: 给列表添加一个过滤器。 这是很常见的做法,如果列表很长的话,例如允许用户进行搜索。

为了方便起见,假设我们通过 searchFilter 来查询列表中的记录。

rush:xhtml;">

控制器的代码保持不变。 看起来仍然没有问题,是吧?

事实上,有一个bug藏在里面。 如果我不说,你能找到吗? 如果能找到,你就已经是Angular大牛了.

请尽量不要使用 $index

BUG其实是在控制器里面:

rush:js;"> $scope.remove = function(index) { var item = $scope.items[index]; removeItem(item); };

这里使用了 index参数,然后就遇到了BUG: 过滤后的索引(indexs)不匹配原始列表的索引。

幸运的是,有一个很简单的方法来避免这种问题: 不要使用$index,而改成实际的item对象。

rush:xhtml;">

控制器如下所示:

rush:js;"> $scope.remove = function(item) { removeItem(item); };

注意,这里将 remove($index) 改成 remove(item) ,并修改了 $scope.remove 函数来直接操作传过来的对象。

这个小小的修改就完全避免了刚才的BUG。

为了更好地说明问题以及解决方案,请参考 nofollow" target="_blank" href="http://plnkr.co/edit/JVQ1yURgQEIrwXFoQQxl?p=preview">interactive example 。

从中可以学到什么?

第一个教训当然是在使用 $index 要小心一点,因为以某些方式使用时很可能会产生BUG。

第二个教训是,请记住类似这样的模式,则可以用更好的做事方式,可以完全避免某些类型的BUG。 我强烈建议大家现在不要使用 $index,从这种简单的思维转变中,就可以减少代码中的很多BUG。

第三个教训是测试并不是什么时候都有用。 即便有自动化测试,也覆盖了足够多的情形,但对于依赖特定输入的情况,也很容易错过某些BUG。 错误本身并不是每次都会出现,即使你也用过滤来测试。

第四个教训是不要破坏抽象 —— 这一点很容易被忽略。理论上 $index 是由 ng-repeat 创建的一个 “模板变量(template variable)”。 这只在 repeat 块里面有意义(并正确起作用)。 当我们将它的值传递到外面时,它就失去了上下文从而不再有效。 如果确实想让它在 repeat 之外依然有效,则必须在控制器中也进行过滤,这就需要一些不是很必要的重复代码。 值得庆幸的是本文中介绍的模式可以用来避免这种情况。

结束语

以上就是关于AngularJS实践之ng-repeat中$index使用注意事项的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

原文链接: AngularJS best practices: Be careful when using ng-repeat's $index

原文日期: 2014-11-10

翻译日期: 2015-01-23

翻译人员: 铁锚 http://blog.csdn.net/renfufei

今天关于javascript – AngularJS将ui-view嵌套到ng-repeat中angular 嵌入html的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用、angularjs – angular-infinite $digest循环在ng-repeat中、Angularjs使用ng-repeat中$even和$odd属性的注意事项、AngularJS实践之使用ng-repeat中$index的注意点的相关知识,请在本站搜索。

本文标签: