Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:当变量变为指令时触发控制器函数_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS:当变量变为指令时触发控制器函数

Javascript AngularJS:当变量变为指令时触发控制器函数,javascript,angularjs,Javascript,Angularjs,我有一个指令要做两件事:(I)它管理HTML中某些选项卡的可视化,(ii)它在会话存储中对对象的值进行myObj处理,并将该对象保存在名为myData的变量中。下面是代码: .directive('panelManager', function(){ return { restrict: 'E', templateUrl: 'foo.html', controller: ['$scope', '$window', function($s

我有一个指令要做两件事:(I)它管理HTML中某些选项卡的可视化,(ii)它在会话存储中对对象的值进行
myObj
处理,并将该对象保存在名为
myData
的变量中。下面是代码:

.directive('panelManager', function(){
    return {
        restrict: 'E',
        templateUrl: 'foo.html',

        controller: ['$scope', '$window',  function($scope, $window) {
            pn = this;
            pn.tab = 1; // init

            this.selectTab = function(setTab) {
                pn.tab = setTab;
            };

            this.isSelected = function(checkTab) {
                return pn.tab === checkTab;
            };

            $scope.$watch(function () {
                return $window.sessionStorage.getItem('myObj');
            }, function (value) {
                pn.myData = JSON.parse(value);
            });
        }],
        controllerAs: 'panels'
    };
})
我有一个控制器来调用WS,每次它更改时,传递前面提到的
myData
的属性
foo
。这是:

.controller('MyDataController', ['$http', function($http) {

    pdc = this;
    pdc.myResultset = [];

    pdc.getDetails = function(val) {
        return $http.get("myUrl"+val+"/").then(function(response){
              pdc.myResultset= response.data;
        });
    };
}]);
是否有方法在该控制器中触发
getDetails
,并在每次MyData更改值时向其传递
val=MyData.foo

通过这种方式,我可以将WS的当前结果集存储在
myResultset
中,并将其分配给本地范围。

您可以从指令发出,但您需要关联控制器中的
$rootScope
。因此,宣言变成:

controller: ['$rootScope', '$scope', '$window',  function($rootScope, $scope, $window) {
然后,你可以这样做:

$scope.$watch(function () {
    return $window.sessionStorage.getItem('myObj');
}, function (value) {
    pn.myData = JSON.parse(value);
    $rootScope.$broadcast('valueChanged', pn.myData);
});
在控制器中:

.controller('MyDataController', ['$http', '$scope', function($http, $scope) {

    pdc = this;
    pdc.myResultset = [];

    pdc.getDetails = function(val) {
        return $http.get("myUrl"+val+"/").then(function(response){
            pdc.myResultset= response.data;
        });
    };

    $scope.$on('valueChanged', function(event, data) {
        pdc.getDetails(data.foo); //pass data.foo to the function
    });
}]);

一个选项是将myData放在根作用域上,然后:1。您仍然可以从指令2访问它。您可以在MyDataControllerPerfect中观看更改,非常酷!PS:如果我必须在更多控制器中重复使用此策略,我是否可以在(…)上插入
$scope.on在工厂中?PPS:missing
$
广播之前
上之前
谢谢您的反馈:)当然可以!请查看以下链接:。不客气!:)读者还有一件有趣的事情:在第一次加载时,
myData
为空,不应该发生
valueChanged
,但出于某种原因,
pdc.getDetails(…)
内部
$scope.on(…)在控制台中触发此错误:无法读取nullSee的属性“foo”: