【问题标题】:Parent scope after changing view template using ng-include使用 ng-include 更改视图模板后的父范围
【发布时间】:2014-08-25 14:39:16
【问题描述】:

我有一个控制器,它使用 2 ng-include 更改其视图(尝试了文件和脚本)。一个用于查看,另一个用于编辑屏幕。

<div class="content-area">
<div class='row'>
    <div class="cs-info">
        <fp-info-bar config="headerConfig"></fp-info-bar>

        <ng-include src="currentTemplate"></ng-include>

    </div>
</div>

视图模板没有输入。编辑模板有一个表单,4 ng-form,它们自己包含输入和自定义指令。

<ng-form name='premisesAddressForm' attempt>
            <div has-permission='CustomerDetailEditOverrideAddressValidation'>
                <input type="checkbox" ng-model="isPremisesAutoCorrectDisabled"><span>Turn off Auto Correct</span>
            </div>
            <fp-address-edit
                    states="states"
                    ng-model='customer.PremisesAddress'
                    on-change="validateAddress(customer.PremisesAddress, premisesAddressForm, isPremisesAutoCorrectDisabled)">
            </fp-address-edit>
        </ng-form>

数据被成功填充,并且在编辑模式下使用 in 指令也可以正常工作。

问题:当我尝试在父控制器上保存数据并检查范围时,我没有在编辑模板上找到任何表单(前提地址表单)或其他输入字段。即这个$scope.premisesAddressForm 不存在。为了清楚起见,保存按钮在同一个模板上,并且绑定到父控制器上的功能,这没有问题。我尝试像这样在父控制器中创建对象,但没有用。

$scope.forms = {};
<ng-form name='froms.premisesAddressForm' attempt>

我知道 ng-include 创建它自己的范围(从父级继承),但我并不想在子级上获取父级对象,所以那里没有问题。我还阅读了一些在 ng-include 更改后,Angular 编译和更新范围的地方。对我来说,问题就在于此。我应该如何使它工作?如果我的方法都是错误的,请随时指出。我的目标是为不同的视图使用相同的控制器,使用不同的输入或没有。谢谢

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    您是正确的,ngInclude 创建了一个新的子范围。问题是父作用域将无权访问子作用域属性。您可以做的与您尝试过的相同,但您应该将值传回,而不是将表单传递回父控制器。

    在您的父控制器中:

    $scope.myObj = {
      customer: {}
    };
    

    在您的模板中:

    <ng-form name='premisesAddressForm' attempt>
                <div has-permission='CustomerDetailEditOverrideAddressValidation'>
                    <input type="checkbox" ng-model="myObj.isPremisesAutoCorrectDisabled"><span>Turn off Auto Correct</span>
                </div>
                <fp-address-edit
                        states="states"
                        ng-model='myObj.customer.PremisesAddress'
                        on-change="validateAddress(myObj.customer.PremisesAddress, premisesAddressForm, myObj.isPremisesAutoCorrectDisabled)">
                </fp-address-edit>
            </ng-form>
    

    如果您需要控制器在保存期间进行通信(例如启动验证),您可以使用事件。

    【讨论】:

    • 嗨瓦迪姆,感谢您的回复。我开始使用 Angular 才一个星期,如果我没有正确理解你,很抱歉。上面的 HTML 是模板和 ng-model 的一部分,状态正在填充它。这工作正常。问题是我无法在我的父控制器中获取 ng-form (premisesAddressForm)。当我写 $scope.premisesAddressForm 时,它没有定义。你能再解释一下吗?
    • 假设我想在提交之前检查 $dirty,如果我无法访问它,我将如何检查它?
    • @ali 有几种方法可以做到,这完全取决于你想要做什么。如果您在保存之类的操作上处理此问题,我建议您使用事件来处理这种流。 IE。父范围通知子级正在发生的事情。
    • 那么您是否建议在子模板控制器中执行实际保存?目前我没有不同模板的控制器。我应该做一个吗?非常感谢您的帮助。
    • @ali,不是子模板控制器中的保存,而是子控制器可以响应事件以保存对象并可以返回父范围一些信息。熟悉范围如何处理事件docs.angularjs.org/api/ng/type/$rootScope.Scope
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2017-02-06
    • 2017-04-04
    相关资源
    最近更新 更多