在使用ngInclude的自定义指令中,ngModel不会更改原始变量

时间:2015-01-19 18:14:55

标签: angularjs angularjs-directive angular-ngmodel angularjs-ng-include

指令内的变量发生变化,但在指令之外它不会改变。这是实际的代码:

main.html中

<div class="row" ng-repeat="row in template">
    <fx-widget type="{{row.type}}" value="post[row.name]"></fx-widget>
    {{post[row.name]}}
</div>

app.js

app.directive('fxWidget', function() {
    return {
        restrict: 'E',
        scope: {
            value: '='
        },
        link: function($scope, $element, $attributes) {
            $scope.typeUrl = '/partials/' + $attributes.type + '.html';
        },
        template: '<div ng-include="typeUrl"></div>',

    };
});

partials/text.html

<input type="text" ng-model="value">

以下是我发现问题的测试和说明:

  1. 首先我测试看看ngModel可能不喜欢通过字典/数组绑定值,所以我在main.html中添加了以下内容:

    <input ng-model="post[row.name]"> {{post[row.name]}}
    

    这个有效。

  2. 我通过更改指令中的模板变量来测试问题是否在ng-include中:

    template: '<input ng-model="value">
    

    这个实际上有效,所以问题出在ng-include

  3. 深入挖掘后,我意识到ng-include甚至不会将数据发送回指令:

    template: '<div ng-include="typeUrl"></div> {{value}}'
    
    // ^^ doesn't work
    

    但是在部分文件中它可以工作:

    partials/text.html
    
    <input type="text" ng-model="value"> {{value}}
    
  4. 我猜测的是ng-include创建范围的副本,这就是它在父范围内不会改变的原因。如何更改范围?

    也是一个异质的问题。如何摆脱ng-include all并手动加载部分? templateUrl参数可以接受具有属性的函数,但它不会将数据编译为绑定到实际变量,因此这是不可能的。

    谢谢!

0 个答案:

没有答案