【问题标题】:How to clear one View's Input value from other View?如何从另一个视图中清除一个视图的输入值?
【发布时间】:2015-11-27 17:40:27
【问题描述】:

我的场景非常简单直接。但我无法得到准确的输出。

就我而言,我有两个名为 Index.htm、Main.htm 的 html 页面和一个名为 mscript.js 的脚本页面。 Index.htm 由一个按钮(清除)组成,Main.htm 由一个输入类型字段组成。

我想要的是:

点击按钮时(从索引视图),用户在输入类型字段(从主视图)中输入的文本必须被清除。

我尝试的是

我已经使用了配置块。

Index.htm:

<div data-ng-app="mangular">
    <div data-ng-controller="mcontroller">Strictly for Demo Purpose
        <br />
        <br />
        <br />
        <div data-ng-view=""></div>
        <br />
        <button type="submit" data-ng-click="clear()">Clear</button>
    </div>
</div>

Main.htm

<div>
  Type your Name : 
  <input type = "text" data-ng-model = "demotext" />
</div>

mscript.js

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

mangular.config(function ($routeProvider) {
    $routeProvider.when('/', {
        templateUrl: 'Main.htm'
    })
});

mangular.controller('mcontroller', function ($scope) {

    //var test = mfactory.getinput();
    $scope.clear = function () {
        $scope.demotext = ""; // This is the place where I'm expecting solution
    }
});

【问题讨论】:

标签: javascript jquery html asp.net angularjs


【解决方案1】:

使用 $broadcast,angularjs 的内置服务。在第一页按钮单击广播内容,然后在您的第二页接收广播事件并清除输入元素上的数据。

来自mcontroller

$rootScope.$broadcast("cleardata", anyObject);  // here you are broadcasting some data which is identified the a name/key that is for this example 'cleardata'

Main.htm

的控制器中
$rootScope.$on("cleardata", function (event, objectData) {
    // do whatever you want and clear the textbox
});

【讨论】:

  • $broadcast 是个好方法。你能用我不知道的代码解释一下吗?
  • @gkrishy,你可以从提供的代码中得到一个想法。
  • 我明白你的意思。这适用于我的场景吗?如果是这样,您希望我将这行代码“$rootScope.$broadcast("cleardata", anyObject);" ?.而且我只有一个按钮单击事件和一个我正在使用的控制器,除此之外我不会去任何地方获取数据。我想直接调用输入字段。
  • 你有两个视图,如果这两个视图都有单独的控制器,那么对于Index.htm 视图,将$rootScope.$broadcast("cleardata", anyObject); 放入点击事件处理程序中。以及Main.htm 视图控制器上的$rootScope.$on 部分。无需将其放在任何单击或其他事件处理程序中。所以这种方式应该可行。
  • 任何意义上的对象?我应该像这样清除文本框 $scope.demotext = ""; ?
【解决方案2】:

试试这个:http://jsfiddle.net/sherali/Mh2UH/31/

但是, - 我将控制器添加到`$routeProvider.

  • 在里面,我添加了$scope.$watch

然后就可以了

var myApp = angular
    .module('myApp', ['ngRoute'])
    .config(function ($routeProvider) {
        $routeProvider
            .when('/', {
                template: '<div>Type your Name : <input type = "text" ng-model = "text" /></div>',
                controller: 'viewCtrl'
            })
            .otherwise({
                redirectTo: '/'
            });
    })

...

myApp.factory('aProvider', function () {
    return {
        text: "default Text"
    }
});

...

myApp.controller('myCtrl', function ($scope, aProvider) {
    $scope.clear = function () {
        aProvider.text = "";
    }
});

myApp.controller('viewCtrl', function ($scope, aProvider) {
    $scope.$watch(function () {
        return aProvider.text;
    }, function (val) {
        $scope.text = val;
    })

    $scope.$watch('text', function (val) {
        aProvider.text = val;
    })
});

【讨论】:

  • @gkrishy。抱歉,我忘记了 ngView 是指令。我认为 main.htm 的作用域父级是 index.html。我也更新了
  • 真的很棒。 +1 替代方式(配置中的模板)。但我的确切要求是两个视图。我想在单击其他视图中的按钮时从一个视图中清除输入值。
  • 谢谢你的好问题。 +1
【解决方案3】:

为 Main.html 创建一个控制器,例如 mainctrl,然后从 mcontroller 像这样访问它 $scope.$parent.mainctrl.demotext = "";

【讨论】:

  • 啊,对了,你需要一个父控制器,如果它适合你的应用程序,也许这就是你应该做的。这是一种在子控制器之间共享信息和功能的简便方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多