Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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:custom direct中的绑定数据在使用“后不再更新”;按“跟踪”;重复_Javascript_Angularjs - Fatal编程技术网

Javascript angularjs:custom direct中的绑定数据在使用“后不再更新”;按“跟踪”;重复

Javascript angularjs:custom direct中的绑定数据在使用“后不再更新”;按“跟踪”;重复,javascript,angularjs,Javascript,Angularjs,这是我之前提出的问题的附录: 我目前的困境是,在ng repeat中使用的自定义指令中生成的数据中存在重复项。这意味着我必须使用“跟踪”。这以某种方式破坏了绑定,当我更新模型时,它不再更新。如果我不使用update并删除重复项(在本例中,这很容易做到,但对于我真正的问题,我做不到),它就可以工作。以下是该问题的解决方法: 我的自定义指令包含以下内容: scope: { data: "=" }, link: function (scope, element, attrs) {

这是我之前提出的问题的附录:

我目前的困境是,在ng repeat中使用的自定义指令中生成的数据中存在重复项。这意味着我必须使用“跟踪”。这以某种方式破坏了绑定,当我更新模型时,它不再更新。如果我不使用update并删除重复项(在本例中,这很容易做到,但对于我真正的问题,我做不到),它就可以工作。以下是该问题的解决方法:

我的自定义指令包含以下内容:

scope: {
    data: "="
},
link: function (scope, element, attrs) {
        scope.$watch(function () {
            return scope.data
        }, function () {
            var getPages = function(extra) {
                var pages = [];
                pages.push('...');
                for (var i = scope.data.list[0]; i <= scope.data.list[1] + extra; i++) {
                    pages.push(i);
                }
                pages.push('...');
                return pages;
            }
            scope.pages = getPages(1);
        }, true);
    },
    // Remove "track by $index" to see this working and make sure to remove the duplicates
    // "..." pushed in to the generated data.
    template: '<ul><li ng-repeat="d in pages track by $index" my-button="d"></li></ul>'
范围:{
数据:“=”
},
链接:函数(范围、元素、属性){
范围:$watch(函数(){
返回scope.data
},函数(){
var getPages=函数(额外){
var页面=[];
pages.push(“…”);

对于(var i=scope.data.list[0];iTrack by优化为不为已创建的项重建DOM。在您的示例中,您使用
$index
作为标识符。因此,
ng repeat
查看标识符
1
(对于
页面
数组中的第二个元素)并决定不必重建DOM。这会导致您遇到的问题

一种可能的解决方案是生成具有唯一id的页面对象,并通过该id进行跟踪:

var lastID = 0;
function createPage(name){
  return { name: name, id: lastID++ };
}

// ... Directive code
pages.push(createPage('...')); // Do this for everything that you push to pages array

// ... More directive code
template: '<ul><li ng-repeat="d in pages track by d.id" my-button="d.name"></li></ul>'
var lastID=0;
函数createPage(名称){
返回{name:name,id:lastID++};
}
//…指令代码
pages.push(createPage(“…”);//对推送到pages数组的所有内容执行此操作
//…更多指令代码
模板:'
    • '

您的JSFIDLE,已更新为工作状态:

现在我所做的一切不是推送双“…”并使其独特并以这种方式处理。这意味着我可以通过删除轨迹。仍然想知道这是否是处理此问题的角度方法。是的,实际上,随着我对此代码进行更多测试,我开始看到这种情况发生。谢谢!