我有两个控制器,并使用app.factory函数在它们之间共享数据。
单击链接时,第一个控制器在模型数组(pluginsDisplayed)中添加一个小部件。将小部件推入数组,并将此更改反映到视图中(使用ng-
repeat显示数组内容):
<div ng-repeat="pluginD in pluginsDisplayed">
<div k2plugin pluginname="{{pluginD.name}}" pluginid="{{pluginD.id}}"></div>
</div>
该小部件基于三个指令k2plugin,remove和resize建立。remove指令将范围添加到k2plugin指令的模板。单击该范围时,将使用删除共享数组中的右侧元素Array.splice()
。共享阵列已正确更新,但更改
未 反映在视图中。但是,当添加另一个元素时,在删除之后,视图将正确刷新,并且不会显示先前删除的元素。
我怎么了?您能解释一下为什么这行不通吗?有没有更好的方法可以完成我想对AngularJS进行的操作?
这是我的index.html:
<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js">
</script>
<script src="main.js"></script>
</head>
<body>
<div ng-app="livePlugins">
<div ng-controller="pluginlistctrl">
<span>Add one of {{pluginList.length}} plugins</span>
<li ng-repeat="plugin in pluginList">
<span><a href="" ng-click="add()">{{plugin.name}}</a></span>
</li>
</div>
<div ng-controller="k2ctrl">
<div ng-repeat="pluginD in pluginsDisplayed">
<div k2plugin pluginname="{{pluginD.name}}" pluginid="{{pluginD.id}}"></div>
</div>
</div>
</div>
</body>
</html>
这是我的main.js:
var app = angular.module ("livePlugins",[]);
app.factory('Data', function () {
return {pluginsDisplayed: []};
});
app.controller ("pluginlistctrl", function ($scope, Data) {
$scope.pluginList = [{name: "plugin1"}, {name:"plugin2"}, {name:"plugin3"}];
$scope.add = function () {
console.log ("Called add on", this.plugin.name, this.pluginList);
var newPlugin = {};
newPlugin.id = this.plugin.name + '_' + (new Date()).getTime();
newPlugin.name = this.plugin.name;
Data.pluginsDisplayed.push (newPlugin);
}
})
app.controller ("k2ctrl", function ($scope, Data) {
$scope.pluginsDisplayed = Data.pluginsDisplayed;
$scope.remove = function (element) {
console.log ("Called remove on ", this.pluginid, element);
var len = $scope.pluginsDisplayed.length;
var index = -1;
// Find the element in the array
for (var i = 0; i < len; i += 1) {
if ($scope.pluginsDisplayed[i].id === this.pluginid) {
index = i;
break;
}
}
// Remove the element
if (index !== -1) {
console.log ("removing the element from the array, index: ", index);
$scope.pluginsDisplayed.splice(index,1);
}
}
$scope.resize = function () {
console.log ("Called resize on ", this.pluginid);
}
})
app.directive("k2plugin", function () {
return {
restrict: "A",
scope: true,
link: function (scope, elements, attrs) {
console.log ("creating plugin");
// This won't work immediately. Attribute pluginname will be undefined
// as soon as this is called.
scope.pluginname = "Loading...";
scope.pluginid = attrs.pluginid;
// Observe changes to interpolated attribute
attrs.$observe('pluginname', function(value) {
console.log('pluginname has changed value to ' + value);
scope.pluginname = attrs.pluginname;
});
// Observe changes to interpolated attribute
attrs.$observe('pluginid', function(value) {
console.log('pluginid has changed value to ' + value);
scope.pluginid = attrs.pluginid;
});
},
template: "<div>{{pluginname}} <span resize>_</span> <span remove>X</span>" +
"<div>Plugin DIV</div>" +
"</div>",
replace: true
};
});
app.directive("remove", function () {
return function (scope, element, attrs) {
element.bind ("mousedown", function () {
scope.remove(element);
})
};
});
app.directive("resize", function () {
return function (scope, element, attrs) {
element.bind ("mousedown", function () {
scope.resize(element);
})
};
});
每当您在AngularJS之外进行某种形式的操作时,例如使用jQuery进行Ajax调用,或将事件绑定到像您这样的元素上,都需要让AngularJS知道自己进行更新。这是您需要执行的代码更改:
app.directive("remove", function () {
return function (scope, element, attrs) {
element.bind ("mousedown", function () {
scope.remove(element);
scope.$apply();
})
};
});
app.directive("resize", function () {
return function (scope, element, attrs) {
element.bind ("mousedown", function () {
scope.resize(element);
scope.$apply();
})
};
});
这是有关它的文档:https :
//docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply
问题内容: 我正在创建一个ajax搜索页面,该页面将由搜索输入框,一系列过滤器下拉列表以及随后显示结果的UL组成。 由于搜索的过滤器部分将在页面上的单独位置,因此我认为创建一个服务来协调输入和搜索服务器端的Ajax请求是一个好主意。然后可以通过几个单独的控制器来调用(一个用于搜索框和结果,另一个用于过滤器)。 我一直在努力的主要事情是在调用ajax时获得刷新结果。如果我将ajax直接放在Searc
问题内容: 我正在尝试使用array 更新 ng-grid。我 这里 有个小伙伴。 添加按钮添加新行。更新按钮更新阵列中的最后一项。 选择一行并按更新按钮。没发生什么事。 按添加按钮。现在,UI将使用新元素&以及以前更新的元素进行更新。 相同的行为一次又一次地重复。 我试过了。我得到: “错误:$ apply已经在进行中” 我什至尝试通过将块放置在呼叫中来进行尝试。同样是同样的错误! 任何指针!
问题内容: 我已经阅读了有关此问题的主题,例如:[\AngularJS中未更新视图,\但我仍然不明白如何在我的简单示例中应用它。 我有这个功能: 当代码中的其他地方更新时(用户单击,交互,发送XHR请求时),它不会更新我的视图。我知道我需要使用$apply做些事情,但我不知道在哪里以及如何做。 有人可以向我解释如何针对这个简单用例解决此问题吗? 我的模型看起来像这样(如果这个问题是必要的)-它里面
问题内容: 我用来加载图像。值是从一些范围变量加载的,如下所示: 我的问题是,当我运行时,它会使属性为空,但不会在属性中反映出来。因此,我不断看到需要空占位符的图像。 我该如何处理? 问题答案: 这是ngSrc和ngHref指令的预期行为。这些指令仅支持识别新路径,但是当路径不可用时,这些指令将以静默方式退出(我在这里看到一个拉取请求。)。 因此,当图像变量不再可用时,可能的解决方法是将ngSho
问题内容: 我有一个ng-repeat,它在更改正在使用的数组中的数据时不会更新。我已经研究了一段时间,但似乎没有任何效果。最初,当页面加载时,ng- repeat显示数据集的第一页,在获取新数据(下一页)并使用该数据设置该数组时,ng- repeat不会注意到更改,并且永远不会填充更新的数组。如果有人可以在正确的方向上指导我,将不胜感激。 }]); 问题答案: 尝试将tbody包装在div中,但
问题内容: 我正在通过ng-repeat循环渲染数据。而且我希望它在更新数组时进行更新。从我阅读的内容来看,这应该会自动发生,但是这是行不通的。那我在做什么错? 的HTML: 控制器(此功能通过ng-click在按钮上触发): Console.log显示该数组已正确更新,但是我视图中的表未更改。我不知道我在做什么错。 问题答案: 那是因为您在method中更改了数组引用。 为了避免这种情况,我们使