AngularJS - 单击对象,访问它的 ID 并触发一个以该 ID 作为参数的函数
AngularJS - Click on object, access it's ID & fire a function with that ID as parameter
我正在尝试构建一个类似简单 iPhone 布局的网络应用程序副本,其中只有主屏幕(显示 "installed" 个应用程序)和一个显示所有可用应用程序的应用程序商店。
当您在应用商店中单击某个应用时,我想访问该应用(div 的)ID 并触发一个将 ID 作为参数发送的函数。该函数应该简单地将 ID 添加到数组中,并且可能(如果可能的话)link 到不同的页面。
到目前为止,我的模型中有这个:
var dummyApp = angular.module("dummyApp", [ "ngRoute"]);
.controller('appController', ['$scope', function($scope) {
$scope.homeApps = [
{id:"1", name:"Dummy", link:"#/"},
{id:"2", name:"Dummy", link:"#/"}];
$scope.allApps = [
{id:"1", name:"Dummy", link:"#/"},
{id:"2", name:"Dummy", link:"#/"},
{id:"3", name:"Dummy", link:"#/"}];
$scope.addApp = function(id) {
$scope.homeApps.push({id:id, name:"new app", link:"/#/"});
};
}]);
简而言之,我想单击一个元素(allApps 数组的一部分),发送 addApp 函数并提供 ID(如果可能,可以从 allApps 数组中获取?)并将其推送到 homeApps(应用程序到主屏幕)
这应该模拟按下一个应用程序,然后当您返回主屏幕时,它会显示在数组中。
我的 HTML 看起来是这样的:
<div ng-click="adApp('3');" class="app" style="background-image:url('icons/{{app.id}}.png');">
</div>
现在我只是发送一个静态的“3”作为 ID,但你明白了:)
任何帮助appriciated!
你非常接近,只需使用 ng-click="addApp(app.id)"
作为你的 div
。
但您遇到的实际问题是,通过对两条路线使用相同的控制器,并且没有共享位置来存储主屏幕上的应用程序集合,您最终会反复重新创建同一套原始应用程序主屏幕上的应用程序。
相反,您需要做的是创建某种 Angular 服务,该服务将被正确初始化,然后允许添加应用程序。这将被注入到您的 appController
中,这样您每次都可以访问同一个集合,而不是每次控制器 运行.
时都创建一个新集合
您可以看到我创建的 a Plunkr 演示了一个非常简单的示例。
代码内容如下:
创建基本服务:
(function (dummyApp) {
var homeApps = [
{id:"1", name:"Dummy", link:"#/"},
// ...
{id:"10", name:"Dummy", link:"#/"}];
dummyApp.factory('homeApps', function () {
return homeApps;
});
})(dummyApp);
然后在你的控制器中使用它:
dummyApp.controller('appController', ['$scope', 'homeApps', function($scope, homeApps) {
$scope.homeApps = homeApps;
$scope.allApps = [
{id:"1", name:"Dummy", link:"#/"},
// ...
{id:"28", name:"Dummy", link:"#/"}];
$scope.addApp = function(id) {
homeApps.push({id:id, name:"new app", link:"#/"});
};
}]);
当然,我可能会创建一些 "classes"(好吧,等效的 JS)来公开一个很好的 API 来操纵每个应用程序,以及一个允许您添加和删除应用程序的集合从本身。然后创建一个公开此 API 的 homeScreen
服务。但这取决于你。这将帮助您入门。
我正在尝试构建一个类似简单 iPhone 布局的网络应用程序副本,其中只有主屏幕(显示 "installed" 个应用程序)和一个显示所有可用应用程序的应用程序商店。
当您在应用商店中单击某个应用时,我想访问该应用(div 的)ID 并触发一个将 ID 作为参数发送的函数。该函数应该简单地将 ID 添加到数组中,并且可能(如果可能的话)link 到不同的页面。
到目前为止,我的模型中有这个:
var dummyApp = angular.module("dummyApp", [ "ngRoute"]);
.controller('appController', ['$scope', function($scope) {
$scope.homeApps = [
{id:"1", name:"Dummy", link:"#/"},
{id:"2", name:"Dummy", link:"#/"}];
$scope.allApps = [
{id:"1", name:"Dummy", link:"#/"},
{id:"2", name:"Dummy", link:"#/"},
{id:"3", name:"Dummy", link:"#/"}];
$scope.addApp = function(id) {
$scope.homeApps.push({id:id, name:"new app", link:"/#/"});
};
}]);
简而言之,我想单击一个元素(allApps 数组的一部分),发送 addApp 函数并提供 ID(如果可能,可以从 allApps 数组中获取?)并将其推送到 homeApps(应用程序到主屏幕)
这应该模拟按下一个应用程序,然后当您返回主屏幕时,它会显示在数组中。
我的 HTML 看起来是这样的:
<div ng-click="adApp('3');" class="app" style="background-image:url('icons/{{app.id}}.png');">
</div>
现在我只是发送一个静态的“3”作为 ID,但你明白了:)
任何帮助appriciated!
你非常接近,只需使用 ng-click="addApp(app.id)"
作为你的 div
。
但您遇到的实际问题是,通过对两条路线使用相同的控制器,并且没有共享位置来存储主屏幕上的应用程序集合,您最终会反复重新创建同一套原始应用程序主屏幕上的应用程序。
相反,您需要做的是创建某种 Angular 服务,该服务将被正确初始化,然后允许添加应用程序。这将被注入到您的 appController
中,这样您每次都可以访问同一个集合,而不是每次控制器 运行.
您可以看到我创建的 a Plunkr 演示了一个非常简单的示例。
代码内容如下:
创建基本服务:
(function (dummyApp) {
var homeApps = [
{id:"1", name:"Dummy", link:"#/"},
// ...
{id:"10", name:"Dummy", link:"#/"}];
dummyApp.factory('homeApps', function () {
return homeApps;
});
})(dummyApp);
然后在你的控制器中使用它:
dummyApp.controller('appController', ['$scope', 'homeApps', function($scope, homeApps) {
$scope.homeApps = homeApps;
$scope.allApps = [
{id:"1", name:"Dummy", link:"#/"},
// ...
{id:"28", name:"Dummy", link:"#/"}];
$scope.addApp = function(id) {
homeApps.push({id:id, name:"new app", link:"#/"});
};
}]);
当然,我可能会创建一些 "classes"(好吧,等效的 JS)来公开一个很好的 API 来操纵每个应用程序,以及一个允许您添加和删除应用程序的集合从本身。然后创建一个公开此 API 的 homeScreen
服务。但这取决于你。这将帮助您入门。