我有以下代码,也可以在 http://jsfiddle.net/garukun/u69PT/上被打乱.

视图:

<div data-ng-app="testApp">
    <div data-ng-controller="testCtrl">
        <strong>{{pkey}}</strong>
        <span data-test-directive data-parent-item="pkey" 
            data-parent-update="update(pkey)"></span>
    </div>
</div>

JS:

var testApp = angular.module('testApp',[]);

testApp.directive('testDirective',function ($timeout) {
    return {
        scope: {
            key: '=parentItem',parentUpdate: '&'
        },replace: true,template: '<div><p>{{key}}</p>' +
            '<button data-ng-click="lock()">Lock</button>' +
            '</div>',controller: function ($scope,$element,$attrs) {
            $scope.lock = function () {
                $scope.key = 'D+' + $scope.key;
                console.log('DIR :',$scope.key);

                // Expecting $scope.$parent.pkey to have also been
                // updated before invoking the next line.
                $scope.parentUpdate();
                // $timeout($scope.parentUpdate); // would work.
            };
        }
    };
});

testApp.controller('testCtrl',function ($scope) {
    $scope.pkey = 'golden';
    $scope.update = function (k) {
        // Expecting local variable k,or $scope.pkey to have been
        // updated by calls in the directive's scope.
        console.log('CTRL:',$scope.pkey,k);
        $scope.pkey = 'C+' + k;
        console.log('CTRL:',$scope.pkey);
    };
});

基本上,我设置了一个隔离范围的指令,其中我从父范围(pkey)双向绑定一个属性(key),并且还委派一个方法(parentUpdate)在上下文中被调用的父范围.

现在,在指令中的ng-click事件处理程序中,我想调用parentUpdate方法并在其中执行某些操作.当我调用该方法时,我期望我的父范围的模型被更新.但实际上,这不是,这是令我困惑的.

这可能是因为中间的一些缺少$摘要循环,因为用$timeout包装parentUpdate调用将按预期工作.

有人会说出一些缺点吗?还是如何正确调用parentUpdate?

解决方法

好的,我打算在这一个破解…似乎你正在改变孤立的孩子和父变量之前的一个$digest循环,双向逻辑同步两个.详情如下:

首先通过点击按钮执行你的lock()函数.这将更新隔离的$scope.key变量.注意:这不会立即更新父$scope.pKey;通常会在下一个$摘要循环中发生,但在这种情况下不会.阅读…
>在lock()中,你调用parentUpdate()来更新父的$scope.pKey变量.
那么执行$digest循环.当它循环它到父范围的方式,正确地检测到$scope.pKey的更改.
> $scope.pKey的更改触发由隔离的作用域中的双向绑定创建的watch(). These lines是关键的
>由隔离范围创建的watch()会检查双向绑定的值是否与父值的值同步.如果不是(在这种情况下不是这样),父类的值将复制到隔离的作用域,即使隔离的作用域的值也发生了变化,事实上已经被更改了.

Misko’s famous post on Angular data-binding描述了$digest循环方法的好处.你在这里看到的是$digest的改变聚合方法的有意义的副作用,其中,如源代码评论所说,parent changed and it has precedence …这意味着你孤立的范围的变化失去了.

上面提到的$timeout()方法通过仅在第一个$digest循环中更改隔离范围的值来避免此问题,允许将其成功复制到父范围,然后调用parentUpdate()

$compile documentation说:

Often it’s desirable to pass data from the isolated scope via an expression and to the parent scope,this can be done by passing a map of local variable names and values into the expression wrapper fn. For example,if the expression is increment(amount) then we can specify the amount value by calling the localFn as localFn({amount: 22}).

这意味着,在步骤2中,您可以通过像这样的对象映射传递您的pkey值:

parentUpdate({pkey: 'D+' + $scope.key })

这是更新的小提琴:http://jsfiddle.net/KbYcr/

javascript – AngularJS:父范围未更新的指令(带隔离范围)双向绑定的更多相关文章

  1. 【swift】15-0520 字典

    字典.count()字典.isEmpty字典[key]=value//增加一个值字典[key]=value2//修改一个值字典.updateValue//返回一个optional类型的值,需要更新的key不存在则更新失败,所以一般用if语句进行判断,if字典.updateValue{println}else{println}用binding显示出值。iflet常量=字典.updateValue{println(“”)}else{println(“”)}显示字典中所有的键值对:forin字典{println

  2. Swift-字典

  3. Swift 字典的常用方法

    /***要正确使用字典,也需要一些条件*1,字典键值对的键和值的类型必须明确,可以直接指定,也可以类似数组直接赋值由编译器自动识别*2,字典必须要初始化*3,键的类型必须是可以被哈希Hashable的**///字典的几种声明方式常用方法见下方代码苹果开发群:414319235欢迎加入欢迎讨论

  4. swift 2.0 字典

    //6.字典---的特点:无序性这个无序性是指字典内部存放的元素顺序跟我们定义时写的元素顺序是没有对应的,但是实质上,字典内部的元素是有序的。),至于为什么,之后会有专门的解说。//并且,字典的key值是唯一的,不能重复。

  5. swift * 字典/Dictionary初始化以及增、删、改、遍历

    学习笔记1、字典初始化vardict=[:]//初始化无类型空字典dict=["1":"aaa","2":"bbb"]print(dict)dict=[1:"1","2":2]//key和value都是不定类型的print(dict)letdict2:Dictionary=["1":111,"2":222]//限定键值类型print(dict2)letdict3:[Stri

  6. Swift基础学习2

    1.数组的创建及操作2.Range的创建3.Dictionary的创建及操作4.func5.闭包

  7. swift dictionary 是否存在key

  8. 是否应该使用可选映射?

    和之前使用可选映射的功能并无区别,但是意义上更加清晰了。略微有点可选映射能够有效避免可能发生的错误吗?有可能,但是也可能带来问题可选映射能够更好地表达编程的思路吗?对于我来说不,但是有可能让那些理解「映射」和「可选值」的人来说是使用可选映射维护代码能变简单吗?

  9. Swift NSKeyedArchiver

    1.在带键的归档中,每个归档字段都有一个key值,解归档时key值要与归档时key值匹配2.带键归档可以一次存储多个对象3.归档的对象是Foundation框架中的对象4.归档和解归档其中任意对象都需要归档和解归档整个文件5.归档后的文件是加密的,所以归档文件的扩展名可以随意取

  10. swift中dictionary字典的使用

    Swift字典用来存储无序的相同类型数据的集合,Swift字典会强制检测元素的类型,如果类型不同则会报错。和数组中的数据项不同,字典中的数据项并没有具体顺序。Swift字典的key没有类型限制可以是整型或字符串,但必须是唯一的。这意味着在创建字典后,可以通过添加、删除、修改的方式改变字典里的项目。如果将一个字典赋值给常量,字典就不可修改,并且字典的大小和内容都不可以修改。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部