在组件中使用 ng-click 时范围不更新
Scope Not Updating When Using ng-click Within a Component
我遇到的问题是在组件中使用 ng-click 时我的范围没有更新。如果我使用 $scope.$apply 或 $timeout 范围也不会更新,所以我不确定问题是什么。
我的想法是,当我单击我的组件 (qdcPopover.html) 中的第二个按钮时,$scope.showGetData 应该更新为 true,然后将更新我的 div index.html。
这是我的代码:
index.html:
<html lang="en" qva-bootstrap="false">
<head>
<title>Data Prep</title>
<script data-main="data-prep" src="/resources/assets/external/requirejs/require.js"></script>
</head>
<body>
<div ng-controller="AppCtrl as ctrl">
<button id="qdpCreateApp" class="lui-button lui-button--rounded">Create App</button>
<qdp-popover></qdp-popover>
<div>Hello {{showGetData}} + {{showAppCreate}}</div>
</div>
</body>
</html>
qdpPopver.html(分量)
<div ng-show="showAppCreate" class="lui-popover" style="width: 400px;">
<div class="lui-popover__header">
<div class="lui-popover__title">{{qdpPopover.title}}</div>
</div>
<div class="lui-popover__body">
{{qdpPopover.body}}
<input id="{{qdpPopover.inputId}}" ng-show="qdpPopover.showInput" class="lui-input"/>
</div>
<div class="lui-popover__footer">
<button class="lui-button lui-popover__button" ng-click="showAppCreate = false">{{qdpPopover.button1}}</button>
<button class="lui-button lui-popover__button" ng-click="createApp()">{{qdpPopover.button2}}</button>
</div>
</div>
数据准备-module.js
// define the angular module with its controller
var app = angular.module('qlikDataPrepModule', []);
// define angular components
app.component('qdpPopover', {
templateUrl: 'qdpPopover.html',
controller: 'AppCtrl'
})
var qdpAppNameInput = "qdpAppNameInput";
// Controller
app.controller('AppCtrl', function ($scope, $location, $http, $timeout) {
$scope.qdpPopover = {
title: "Create new App",
body: "Name of my app:",
button1: "Cancel",
button2: "Create",
showInput: true,
inputId: qdpAppNameInput
};
$scope.showGetData = false;
$scope.showAppCreate = false;
// Function for app creation
$scope.createApp = function () {
$scope.showGetData = true;
$scope.$apply();
}
})
如你所见here $scope.$apply 方法需要一个参数来执行,试试这个:
$scope.createApp = function () {
$scope.$apply(function () {
$scope.showGetData = true;
});
}
或者您可能不在正确的范围内,这就是您的全部代码吗?你甚至没有引用 angular.js
这是一个非常简单的例子,我把函数名称和功能弄乱了一点,所以这可能不是你想要的,但这只是一个例子。
从 the docs 看来,组件范围似乎始终是隔离的,因此即使使用相同的控制器,您实际上也有 2 个不同的实例。有使用 require
在组件之间进行通信但无法正常工作的示例。(那里的文档有点稀疏)。
然而,通过使用服务可以正常工作。该服务在您控制器的所有实例之间共享数据。
希望对你有所帮助,祝你好运!
// define the angular module with its controller
var app = angular.module('qlikDataPrepModule', []);
// define angular components
app.component('qdpPopover', {
template: `<div ng-show="getShowAppCreate()" class="lui-popover" style="width: 400px;"><div>Hello {{getShowGetData()}} + {{getShowAppCreate()}}</div>
<div class="lui-popover__header">
<div class="lui-popover__title">{{qdpPopover.title}}</div>
</div>
<div class="lui-popover__body">
{{qdpPopover.body}}
<input id="{{qdpPopover.inputId}}" ng-show="qdpPopover.showInput" class="lui-input"/>
</div>
<div class="lui-popover__footer">
<button class="lui-button lui-popover__button" ng-click="showAppCreate(false)">{{qdpPopover.button1}}</button>
<button class="lui-button lui-popover__button" ng-click="showGetData(true)">{{qdpPopover.button2}}</button>
</div>
</div>`,
controller: 'AppCtrl',
})
var qdpAppNameInput = "qdpAppNameInput";
// Controller
app.controller('AppCtrl', function ($scope, $location, $http, dataService) {
$scope.qdpPopover = {
title: "Create new App",
body: "Name of my app:",
button1: "Cancel",
button2: "Create",
showInput: true,
inputId: qdpAppNameInput
};
// Function for app creation
$scope.showGetData = function (val) {
dataService.showGetData = val;
}
$scope.getShowGetData = function () {
return dataService.showGetData;
}
// Function for show popover
$scope.showAppCreate = function (val) {
dataService.showAppCreate = val;
}
$scope.getShowAppCreate = function () {
return dataService.showAppCreate;
}
})
app.factory('dataService', function(){
var data = {};
data.showGetData = false;
data.showAppCreate = false;
return data;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<html lang="en" qva-bootstrap="false">
<head>
<title>Data Prep</title>
<script data-main="data-prep" src="/resources/assets/external/requirejs/require.js"></script>
</head>
<body ng-app="qlikDataPrepModule">
<div ng-controller="AppCtrl as ctrl">
<button id="qdpCreateApp" class="lui-button lui-button--rounded" ng-click="showAppCreate(true)">Create App</button>
<qdp-popover></qdp-popover>
<div>Hello {{getShowGetData()}} + {{getShowAppCreate()}}</div>
</div>
</body>
</html>
我遇到的问题是在组件中使用 ng-click 时我的范围没有更新。如果我使用 $scope.$apply 或 $timeout 范围也不会更新,所以我不确定问题是什么。
我的想法是,当我单击我的组件 (qdcPopover.html) 中的第二个按钮时,$scope.showGetData 应该更新为 true,然后将更新我的 div index.html。
这是我的代码:
index.html:
<html lang="en" qva-bootstrap="false">
<head>
<title>Data Prep</title>
<script data-main="data-prep" src="/resources/assets/external/requirejs/require.js"></script>
</head>
<body>
<div ng-controller="AppCtrl as ctrl">
<button id="qdpCreateApp" class="lui-button lui-button--rounded">Create App</button>
<qdp-popover></qdp-popover>
<div>Hello {{showGetData}} + {{showAppCreate}}</div>
</div>
</body>
</html>
qdpPopver.html(分量)
<div ng-show="showAppCreate" class="lui-popover" style="width: 400px;">
<div class="lui-popover__header">
<div class="lui-popover__title">{{qdpPopover.title}}</div>
</div>
<div class="lui-popover__body">
{{qdpPopover.body}}
<input id="{{qdpPopover.inputId}}" ng-show="qdpPopover.showInput" class="lui-input"/>
</div>
<div class="lui-popover__footer">
<button class="lui-button lui-popover__button" ng-click="showAppCreate = false">{{qdpPopover.button1}}</button>
<button class="lui-button lui-popover__button" ng-click="createApp()">{{qdpPopover.button2}}</button>
</div>
</div>
数据准备-module.js
// define the angular module with its controller
var app = angular.module('qlikDataPrepModule', []);
// define angular components
app.component('qdpPopover', {
templateUrl: 'qdpPopover.html',
controller: 'AppCtrl'
})
var qdpAppNameInput = "qdpAppNameInput";
// Controller
app.controller('AppCtrl', function ($scope, $location, $http, $timeout) {
$scope.qdpPopover = {
title: "Create new App",
body: "Name of my app:",
button1: "Cancel",
button2: "Create",
showInput: true,
inputId: qdpAppNameInput
};
$scope.showGetData = false;
$scope.showAppCreate = false;
// Function for app creation
$scope.createApp = function () {
$scope.showGetData = true;
$scope.$apply();
}
})
如你所见here $scope.$apply 方法需要一个参数来执行,试试这个:
$scope.createApp = function () {
$scope.$apply(function () {
$scope.showGetData = true;
});
}
或者您可能不在正确的范围内,这就是您的全部代码吗?你甚至没有引用 angular.js
这是一个非常简单的例子,我把函数名称和功能弄乱了一点,所以这可能不是你想要的,但这只是一个例子。
从 the docs 看来,组件范围似乎始终是隔离的,因此即使使用相同的控制器,您实际上也有 2 个不同的实例。有使用 require
在组件之间进行通信但无法正常工作的示例。(那里的文档有点稀疏)。
然而,通过使用服务可以正常工作。该服务在您控制器的所有实例之间共享数据。
希望对你有所帮助,祝你好运!
// define the angular module with its controller
var app = angular.module('qlikDataPrepModule', []);
// define angular components
app.component('qdpPopover', {
template: `<div ng-show="getShowAppCreate()" class="lui-popover" style="width: 400px;"><div>Hello {{getShowGetData()}} + {{getShowAppCreate()}}</div>
<div class="lui-popover__header">
<div class="lui-popover__title">{{qdpPopover.title}}</div>
</div>
<div class="lui-popover__body">
{{qdpPopover.body}}
<input id="{{qdpPopover.inputId}}" ng-show="qdpPopover.showInput" class="lui-input"/>
</div>
<div class="lui-popover__footer">
<button class="lui-button lui-popover__button" ng-click="showAppCreate(false)">{{qdpPopover.button1}}</button>
<button class="lui-button lui-popover__button" ng-click="showGetData(true)">{{qdpPopover.button2}}</button>
</div>
</div>`,
controller: 'AppCtrl',
})
var qdpAppNameInput = "qdpAppNameInput";
// Controller
app.controller('AppCtrl', function ($scope, $location, $http, dataService) {
$scope.qdpPopover = {
title: "Create new App",
body: "Name of my app:",
button1: "Cancel",
button2: "Create",
showInput: true,
inputId: qdpAppNameInput
};
// Function for app creation
$scope.showGetData = function (val) {
dataService.showGetData = val;
}
$scope.getShowGetData = function () {
return dataService.showGetData;
}
// Function for show popover
$scope.showAppCreate = function (val) {
dataService.showAppCreate = val;
}
$scope.getShowAppCreate = function () {
return dataService.showAppCreate;
}
})
app.factory('dataService', function(){
var data = {};
data.showGetData = false;
data.showAppCreate = false;
return data;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<html lang="en" qva-bootstrap="false">
<head>
<title>Data Prep</title>
<script data-main="data-prep" src="/resources/assets/external/requirejs/require.js"></script>
</head>
<body ng-app="qlikDataPrepModule">
<div ng-controller="AppCtrl as ctrl">
<button id="qdpCreateApp" class="lui-button lui-button--rounded" ng-click="showAppCreate(true)">Create App</button>
<qdp-popover></qdp-popover>
<div>Hello {{getShowGetData()}} + {{getShowAppCreate()}}</div>
</div>
</body>
</html>